diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java index 9751f96870f..2c38dc02f6c 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java @@ -1663,7 +1663,8 @@ public class ExpressionCodegen extends KtVisitor impleme PropertyDescriptor propertyDescriptor = (PropertyDescriptor) descriptor; // `this` is represented as first parameter of function in erased inline class - if (contextKind() == OwnerKind.ERASED_INLINE_CLASS) { + if (contextKind() == OwnerKind.ERASED_INLINE_CLASS && + InlineClassesUtilsKt.isInlineClass(propertyDescriptor.getContainingDeclaration())) { Type underlyingRepresentationType = typeMapper.mapType(propertyDescriptor.getType()); return StackValue.local(0, underlyingRepresentationType); } diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/KotlinTypeMapper.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/KotlinTypeMapper.java index 7f51eada70c..64f0660a8be 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/KotlinTypeMapper.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/KotlinTypeMapper.java @@ -810,13 +810,13 @@ public class KotlinTypeMapper { } } else { - boolean isInsideInlineClass = currentOwner.isInline(); + boolean toInlinedErasedClass = currentOwner.isInline() && !isAccessor(functionDescriptor); boolean isStaticInvocation = (isStaticDeclaration(functionDescriptor) && !(functionDescriptor instanceof ImportedFromObjectCallableDescriptor)) || isStaticAccessor(functionDescriptor) || CodegenUtilKt.isJvmStaticInObjectOrClassOrInterface(functionDescriptor) || - isInsideInlineClass; + toInlinedErasedClass; if (isStaticInvocation) { invokeOpcode = INVOKESTATIC; isInterfaceMember = currentIsInterface && currentOwner instanceof JavaClassDescriptor; @@ -838,7 +838,7 @@ public class KotlinTypeMapper { ? overriddenSpecialBuiltinFunction.getOriginal() : functionDescriptor.getOriginal(); - signature = isInsideInlineClass + signature = toInlinedErasedClass ? mapSignatureForInlineErasedClassSkipGeneric(functionToCall) : mapSignatureSkipGeneric(functionToCall); returnKotlinType = functionToCall.getReturnType(); @@ -846,7 +846,7 @@ public class KotlinTypeMapper { ClassDescriptor receiver = (currentIsInterface && !originalIsInterface) || currentOwner instanceof FunctionClassDescriptor ? declarationOwner : currentOwner; - owner = isInsideInlineClass ? mapErasedInlineClass(receiver) : mapClass(receiver); + owner = toInlinedErasedClass ? mapErasedInlineClass(receiver) : mapClass(receiver); thisClass = owner; dispatchReceiverKotlinType = receiver.getDefaultType(); } diff --git a/compiler/testData/codegen/box/inlineClasses/referToPropertyInCompanionObjectOfInlineClass.kt b/compiler/testData/codegen/box/inlineClasses/referToPropertyInCompanionObjectOfInlineClass.kt new file mode 100644 index 00000000000..030e02e2e42 --- /dev/null +++ b/compiler/testData/codegen/box/inlineClasses/referToPropertyInCompanionObjectOfInlineClass.kt @@ -0,0 +1,23 @@ +// !LANGUAGE: +InlineClasses + +inline class Foo(val c: Char) { + companion object { + val prop = "O" + const val constVal = 1 + fun funInCompanion(): String = "K" + } + + fun simple() { + prop + constVal + funInCompanion() + } + + fun asResult(): String = prop + constVal + funInCompanion() + c +} + +fun box(): String { + val r = Foo('2') + if (r.asResult() != "O1K2") return "fail" + return "OK" +} \ No newline at end of file diff --git a/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index 854e9312d99..c268e9401a2 100644 --- a/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -10341,6 +10341,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes doTest(fileName); } + @TestMetadata("referToPropertyInCompanionObjectOfInlineClass.kt") + public void testReferToPropertyInCompanionObjectOfInlineClass() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/inlineClasses/referToPropertyInCompanionObjectOfInlineClass.kt"); + doTest(fileName); + } + @TestMetadata("useInlineFunctionInsideInlineClass.kt") public void testUseInlineFunctionInsideInlineClass() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/inlineClasses/useInlineFunctionInsideInlineClass.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index e0e45406768..a8ee2e0d0cc 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -10341,6 +10341,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { doTest(fileName); } + @TestMetadata("referToPropertyInCompanionObjectOfInlineClass.kt") + public void testReferToPropertyInCompanionObjectOfInlineClass() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/inlineClasses/referToPropertyInCompanionObjectOfInlineClass.kt"); + doTest(fileName); + } + @TestMetadata("useInlineFunctionInsideInlineClass.kt") public void testUseInlineFunctionInsideInlineClass() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/inlineClasses/useInlineFunctionInsideInlineClass.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index 1e5f3d90089..615f7c2f87e 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -10341,6 +10341,12 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes doTest(fileName); } + @TestMetadata("referToPropertyInCompanionObjectOfInlineClass.kt") + public void testReferToPropertyInCompanionObjectOfInlineClass() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/inlineClasses/referToPropertyInCompanionObjectOfInlineClass.kt"); + doTest(fileName); + } + @TestMetadata("useInlineFunctionInsideInlineClass.kt") public void testUseInlineFunctionInsideInlineClass() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/inlineClasses/useInlineFunctionInsideInlineClass.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 b6dea659a0b..907a7cbe8b2 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 @@ -11301,6 +11301,12 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { doTest(fileName); } + @TestMetadata("referToPropertyInCompanionObjectOfInlineClass.kt") + public void testReferToPropertyInCompanionObjectOfInlineClass() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/inlineClasses/referToPropertyInCompanionObjectOfInlineClass.kt"); + doTest(fileName); + } + @TestMetadata("useInlineFunctionInsideInlineClass.kt") public void testUseInlineFunctionInsideInlineClass() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/inlineClasses/useInlineFunctionInsideInlineClass.kt");