diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/context/ClassContext.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/context/ClassContext.java index 4a5435e6491..2d8665debfb 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/context/ClassContext.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/context/ClassContext.java @@ -30,6 +30,14 @@ public class ClassContext extends FieldOwnerContext { super(contextDescriptor, contextKind, parentContext, typeMapper.getBindingContext().get(CLOSURE, contextDescriptor), contextDescriptor, localLookup); + if (contextKind == OwnerKind.ERASED_INLINE_CLASS) { + assert parentContext instanceof ClassContext && + parentContext.getContextKind() == OwnerKind.IMPLEMENTATION && + parentContext.getContextDescriptor() == contextDescriptor: + "Erased inline class context should be created inside implementation context for the same class:" + contextDescriptor + + "parent: " + parentContext; + } + this.typeMapper = typeMapper; } diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/context/CodegenContext.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/context/CodegenContext.java index 7adb01ea696..b2481dd9fd4 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/context/CodegenContext.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/context/CodegenContext.java @@ -393,13 +393,13 @@ public abstract class CodegenContext { public CodegenContext findParentContextWithDescriptor(DeclarationDescriptor descriptor) { CodegenContext c = this; while (c != null) { - if (!c.shouldSkipThisContextInHierarchy() && c.getContextDescriptor() == descriptor) break; + if (!c.isShadowedByParentContext() && c.getContextDescriptor() == descriptor) break; c = c.getParentContext(); } return c; } - private boolean shouldSkipThisContextInHierarchy() { + private boolean isShadowedByParentContext() { return getContextKind() == OwnerKind.ERASED_INLINE_CLASS; } diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/SourceCompilerForInline.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/SourceCompilerForInline.kt index 0df5ad422a6..fbd6bf45954 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/SourceCompilerForInline.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/SourceCompilerForInline.kt @@ -429,7 +429,7 @@ class PsiSourceCompilerForInline(private val codegen: ExpressionCodegen, overrid } val container = descriptor.containingDeclaration ?: error("No container for descriptor: $descriptor") - val parent = getContext( + val containerContext = getContext( container, descriptor, state, @@ -440,7 +440,7 @@ class PsiSourceCompilerForInline(private val codegen: ExpressionCodegen, overrid return when (descriptor) { is ScriptDescriptor -> { val earlierScripts = state.replSpecific.earlierScriptsForReplInterpreter - parent.intoScript( + containerContext.intoScript( descriptor, earlierScripts ?: emptyList(), descriptor as ClassDescriptor, state.typeMapper @@ -449,21 +449,27 @@ class PsiSourceCompilerForInline(private val codegen: ExpressionCodegen, overrid is ClassDescriptor -> { val kind = when { - DescriptorUtils.isInterface(descriptor) && innerDescriptor !is ClassDescriptor && - !innerDescriptor.isCallableMemberWithJvmDefaultAnnotation() -> OwnerKind.DEFAULT_IMPLS - - descriptor.isInlineClass() -> OwnerKind.ERASED_INLINE_CLASS - - else -> OwnerKind.IMPLEMENTATION + DescriptorUtils.isInterface(descriptor) && + innerDescriptor !is ClassDescriptor && + !innerDescriptor.isCallableMemberWithJvmDefaultAnnotation() -> + OwnerKind.DEFAULT_IMPLS + else -> + OwnerKind.IMPLEMENTATION } additionalInners.addIfNotNull( InnerClassConsumer.classForInnerClassRecord(descriptor, kind == OwnerKind.DEFAULT_IMPLS) ) - parent.intoClass(descriptor, kind, state) + + if (descriptor.isInlineClass()) { + containerContext.intoClass(descriptor, OwnerKind.IMPLEMENTATION, state) + .intoClass(descriptor, OwnerKind.ERASED_INLINE_CLASS, state) + } else { + containerContext.intoClass(descriptor, kind, state) + } } is FunctionDescriptor -> { - parent.intoFunction(descriptor) + containerContext.intoFunction(descriptor) } else -> { throw IllegalStateException("Couldn't build context for $descriptor") diff --git a/compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/kt30780.kt b/compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/kt30780.kt new file mode 100644 index 00000000000..dd24e0a5a0d --- /dev/null +++ b/compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/kt30780.kt @@ -0,0 +1,16 @@ +// !LANGUAGE: +InlineClasses +// IGNORE_BACKEND: JVM_IR + +inline class Test(val x: Int) { + private companion object { + private const val CONSTANT = "OK" + } + + fun crash() = getInlineConstant() + + private inline fun getInlineConstant(): String { + return CONSTANT + } +} + +fun box() = Test(1).crash() \ 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 7c6f993bee7..994624f2ac4 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -12693,6 +12693,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/kt27513.kt"); } + @TestMetadata("kt30780.kt") + public void testKt30780() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/kt30780.kt"); + } + @TestMetadata("lambdaInInlineClassFun.kt") public void testLambdaInInlineClassFun() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/lambdaInInlineClassFun.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index ee5597cf827..0de4d5016a2 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -12693,6 +12693,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/kt27513.kt"); } + @TestMetadata("kt30780.kt") + public void testKt30780() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/kt30780.kt"); + } + @TestMetadata("lambdaInInlineClassFun.kt") public void testLambdaInInlineClassFun() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/lambdaInInlineClassFun.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index 14dea039ed6..1b74d60caa5 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -12698,6 +12698,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/kt27513.kt"); } + @TestMetadata("kt30780.kt") + public void testKt30780() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/kt30780.kt"); + } + @TestMetadata("lambdaInInlineClassFun.kt") public void testLambdaInInlineClassFun() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/lambdaInInlineClassFun.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java index cf969dcbf1a..a6e71cd1c15 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java @@ -10128,6 +10128,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { runTest("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/kt27513.kt"); } + @TestMetadata("kt30780.kt") + public void testKt30780() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/kt30780.kt"); + } + @TestMetadata("lambdaInInlineClassFun.kt") public void testLambdaInInlineClassFun() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/lambdaInInlineClassFun.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 63112efe47d..245fab06d09 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 @@ -11298,6 +11298,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { runTest("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/kt27513.kt"); } + @TestMetadata("kt30780.kt") + public void testKt30780() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/kt30780.kt"); + } + @TestMetadata("lambdaInInlineClassFun.kt") public void testLambdaInInlineClassFun() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/contextsAndAccessors/lambdaInInlineClassFun.kt");