diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java index cd8b1ea4c39..c0ea35b177d 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java @@ -1105,7 +1105,8 @@ public class ExpressionCodegen extends KtVisitor impleme ClassDescriptor captureThis = closure.getCapturedOuterClassDescriptor(); if (captureThis != null) { StackValue thisOrOuter = generateThisOrOuter(captureThis, false); - assert !isPrimitive(thisOrOuter.type) : "This or outer should be non primitive: " + thisOrOuter.type; + assert !isPrimitive(thisOrOuter.type) || captureThis.isInline() : + "This or outer for " + captureThis + " should be non-primitive: " + thisOrOuter.type; callGenerator.putCapturedValueOnStack(thisOrOuter, thisOrOuter.type, paramIndex++); } } @@ -2844,8 +2845,8 @@ public class ExpressionCodegen extends KtVisitor impleme private StackValue generateThisOrOuterFromContext(@NotNull ClassDescriptor thisOrOuterClass, boolean isSuper, boolean forceOuter) { CodegenContext cur = context; - SimpleType thisType = thisOrOuterClass.getDefaultType(); - StackValue result = StackValue.local(0, asmType(thisType), thisType); + SimpleType contextType = cur.getThisDescriptor().getDefaultType(); + StackValue result = StackValue.local(0, asmType(contextType), contextType); boolean inStartConstructorContext = cur instanceof ConstructorContext; while (cur != null) { ClassDescriptor thisDescriptor = cur.getThisDescriptor(); diff --git a/compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/captureInlineClassInstanceInLambda.kt b/compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/captureInlineClassInstanceInLambda.kt new file mode 100644 index 00000000000..d280b895a6d --- /dev/null +++ b/compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/captureInlineClassInstanceInLambda.kt @@ -0,0 +1,10 @@ +// !LANGUAGE: +InlineClasses +// IGNORE_BACKEND: JVM_IR + +inline class R(private val r: Int) { + fun test() = { ok() }() + + fun ok() = "OK" +} + +fun box() = R(0).test() \ No newline at end of file diff --git a/compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/captureInlineClassInstanceInObject.kt b/compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/captureInlineClassInstanceInObject.kt new file mode 100644 index 00000000000..bcea56635fd --- /dev/null +++ b/compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/captureInlineClassInstanceInObject.kt @@ -0,0 +1,12 @@ +// !LANGUAGE: +InlineClasses +// IGNORE_BACKEND: JVM_IR + +inline class R(private val r: Int) { + fun test() = object { + override fun toString() = ok() + }.toString() + + fun ok() = "OK" +} + +fun box() = R(0).test() \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index 30e702d183c..a4804bd0466 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -11941,6 +11941,16 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.JVM, true); } + @TestMetadata("captureInlineClassInstanceInLambda.kt") + public void testCaptureInlineClassInstanceInLambda() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/captureInlineClassInstanceInLambda.kt"); + } + + @TestMetadata("captureInlineClassInstanceInObject.kt") + public void testCaptureInlineClassInstanceInObject() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/captureInlineClassInstanceInObject.kt"); + } + @TestMetadata("inlineLambdaInInlineClassFun.kt") public void testInlineLambdaInInlineClassFun() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/inlineLambdaInInlineClassFun.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index da6afe32be3..b04ae3e92f2 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -11941,6 +11941,16 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.JVM, true); } + @TestMetadata("captureInlineClassInstanceInLambda.kt") + public void testCaptureInlineClassInstanceInLambda() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/captureInlineClassInstanceInLambda.kt"); + } + + @TestMetadata("captureInlineClassInstanceInObject.kt") + public void testCaptureInlineClassInstanceInObject() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/captureInlineClassInstanceInObject.kt"); + } + @TestMetadata("inlineLambdaInInlineClassFun.kt") public void testInlineLambdaInInlineClassFun() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/inlineLambdaInInlineClassFun.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index 99f30862c8a..e8bd87c873d 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -11946,6 +11946,16 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.JVM_IR, true); } + @TestMetadata("captureInlineClassInstanceInLambda.kt") + public void testCaptureInlineClassInstanceInLambda() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/captureInlineClassInstanceInLambda.kt"); + } + + @TestMetadata("captureInlineClassInstanceInObject.kt") + public void testCaptureInlineClassInstanceInObject() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/captureInlineClassInstanceInObject.kt"); + } + @TestMetadata("inlineLambdaInInlineClassFun.kt") public void testInlineLambdaInInlineClassFun() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/inlineLambdaInInlineClassFun.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/IrJsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/IrJsCodegenBoxTestGenerated.java index dce8f80427b..88d8e52e365 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/IrJsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/IrJsCodegenBoxTestGenerated.java @@ -10481,6 +10481,16 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.JS_IR, true); } + @TestMetadata("captureInlineClassInstanceInLambda.kt") + public void testCaptureInlineClassInstanceInLambda() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/captureInlineClassInstanceInLambda.kt"); + } + + @TestMetadata("captureInlineClassInstanceInObject.kt") + public void testCaptureInlineClassInstanceInObject() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/captureInlineClassInstanceInObject.kt"); + } + @TestMetadata("inlineLambdaInInlineClassFun.kt") public void testInlineLambdaInInlineClassFun() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/inlineLambdaInInlineClassFun.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java index 2078a91874c..a7c63c59384 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java @@ -11526,6 +11526,16 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.JS, true); } + @TestMetadata("captureInlineClassInstanceInLambda.kt") + public void testCaptureInlineClassInstanceInLambda() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/captureInlineClassInstanceInLambda.kt"); + } + + @TestMetadata("captureInlineClassInstanceInObject.kt") + public void testCaptureInlineClassInstanceInObject() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/captureInlineClassInstanceInObject.kt"); + } + @TestMetadata("inlineLambdaInInlineClassFun.kt") public void testInlineLambdaInInlineClassFun() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/inlineLambdaInInlineClassFun.kt");