From e5e597088391247c1f4ed66ccfc9d6d8d3fae467 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Fri, 18 Feb 2022 02:27:03 +0100 Subject: [PATCH] JVM IR: workaround indirect dependency between lowerings #KT-51353 Fixed --- .../FirBlackBoxCodegenTestGenerated.java | 6 ++++++ .../jvm/MemoizedInlineClassReplacements.kt | 6 +++++- .../codegen/box/inlineClasses/kt51353.kt | 17 +++++++++++++++++ .../codegen/BlackBoxCodegenTestGenerated.java | 6 ++++++ .../codegen/IrBlackBoxCodegenTestGenerated.java | 6 ++++++ .../codegen/LightAnalysisModeTestGenerated.java | 5 +++++ 6 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/codegen/box/inlineClasses/kt51353.kt diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java index 5c83cd8a5e3..e095b94d509 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java @@ -21163,6 +21163,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/inlineClasses/kt51254.kt", TransformersFunctions.getReplaceOptionalJvmInlineAnnotationWithReal()); } + @Test + @TestMetadata("kt51353.kt") + public void testKt51353() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/kt51353.kt"); + } + @Test @TestMetadata("mangledDefaultParameterFunction.kt") public void testMangledDefaultParameterFunction() throws Exception { diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/MemoizedInlineClassReplacements.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/MemoizedInlineClassReplacements.kt index 8e276c3a73f..41ff4a7b023 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/MemoizedInlineClassReplacements.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/MemoizedInlineClassReplacements.kt @@ -290,7 +290,11 @@ class MemoizedInlineClassReplacements( parent = propertySymbol.owner.parent copyAttributes(propertySymbol.owner) annotations = propertySymbol.owner.annotations - backingField = propertySymbol.owner.backingField + // In case this property is declared in an object in another file which is not yet lowered, its backing field will + // be made static later. We have to handle it here though, because this new property will be saved to the cache + // and reused when lowering the same call in all subsequent files, which would be incorrect if it was unlowered. + backingField = context.cachedDeclarations.getStaticBackingField(propertySymbol.owner) + ?: propertySymbol.owner.backingField } } correspondingPropertySymbol = property.symbol diff --git a/compiler/testData/codegen/box/inlineClasses/kt51353.kt b/compiler/testData/codegen/box/inlineClasses/kt51353.kt new file mode 100644 index 00000000000..c7870fc7189 --- /dev/null +++ b/compiler/testData/codegen/box/inlineClasses/kt51353.kt @@ -0,0 +1,17 @@ +// TARGET_BACKEND: JVM +// WITH_STDLIB +// FILE: 1.kt + +val referenceFromOtherFile = O.A + +// FILE: 2.kt + +@JvmInline +value class Z(val value: String) + +object O { + val A = Z("OK") + val B = A +} + +fun box(): String = O.B.value diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java index 564c2a39658..49b8c80d017 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java @@ -20725,6 +20725,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/inlineClasses/kt51254.kt", TransformersFunctions.getReplaceOptionalJvmInlineAnnotationWithReal()); } + @Test + @TestMetadata("kt51353.kt") + public void testKt51353() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/kt51353.kt"); + } + @Test @TestMetadata("mangledDefaultParameterFunction.kt") public void testMangledDefaultParameterFunction() throws Exception { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java index cc7a68e3256..d736dc7c2b5 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java @@ -21163,6 +21163,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/inlineClasses/kt51254.kt", TransformersFunctions.getReplaceOptionalJvmInlineAnnotationWithReal()); } + @Test + @TestMetadata("kt51353.kt") + public void testKt51353() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/kt51353.kt"); + } + @Test @TestMetadata("mangledDefaultParameterFunction.kt") public void testMangledDefaultParameterFunction() throws Exception { diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index b939be1b832..8aa01be055f 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -17315,6 +17315,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/inlineClasses/kt51157.kt"); } + @TestMetadata("kt51353.kt") + public void testKt51353() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/kt51353.kt"); + } + @TestMetadata("mangledDefaultParameterFunction.kt") public void testMangledDefaultParameterFunction() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/mangledDefaultParameterFunction.kt", TransformersFunctions.getReplaceOptionalJvmInlineAnnotationWithReal());