From 7dbb0c7d20a3a6435e5331a1afd48c5607c40917 Mon Sep 17 00:00:00 2001 From: Mads Ager Date: Thu, 4 Mar 2021 13:54:18 +0100 Subject: [PATCH] [IR] Make IrGetObjectValue copyable to avoid duplicate IR nodes. Fixes KT-45170 --- .../codegen/FirBlackBoxCodegenTestGenerated.java | 6 ++++++ .../kotlin/ir/expressions/IrDeclarationReference.kt | 2 +- .../kotlin/ir/expressions/impl/IrGetObjectValueImpl.kt | 5 +++++ compiler/testData/codegen/box/objects/kt45170.kt | 10 ++++++++++ .../runners/codegen/BlackBoxCodegenTestGenerated.java | 6 ++++++ .../codegen/IrBlackBoxCodegenTestGenerated.java | 6 ++++++ .../kotlin/codegen/LightAnalysisModeTestGenerated.java | 5 +++++ .../es6/semantics/IrJsCodegenBoxES6TestGenerated.java | 5 +++++ .../test/ir/semantics/IrJsCodegenBoxTestGenerated.java | 5 +++++ .../js/test/semantics/JsCodegenBoxTestGenerated.java | 5 +++++ .../wasm/semantics/IrCodegenBoxWasmTestGenerated.java | 5 +++++ 11 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/codegen/box/objects/kt45170.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 43647743357..802d44a3b05 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 @@ -25170,6 +25170,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/objects/kt42758.kt"); } + @Test + @TestMetadata("kt45170.kt") + public void testKt45170() throws Exception { + runTest("compiler/testData/codegen/box/objects/kt45170.kt"); + } + @Test @TestMetadata("kt535.kt") public void testKt535() throws Exception { diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrDeclarationReference.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrDeclarationReference.kt index 8536230156d..68db3f2622c 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrDeclarationReference.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrDeclarationReference.kt @@ -27,7 +27,7 @@ abstract class IrDeclarationReference : IrExpression() { abstract class IrGetSingletonValue : IrDeclarationReference() -abstract class IrGetObjectValue : IrGetSingletonValue() { +abstract class IrGetObjectValue : IrGetSingletonValue(), IrExpressionWithCopy { abstract override val symbol: IrClassSymbol } diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrGetObjectValueImpl.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrGetObjectValueImpl.kt index 5393fe3eb0b..4d94a1aa808 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrGetObjectValueImpl.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrGetObjectValueImpl.kt @@ -16,6 +16,7 @@ package org.jetbrains.kotlin.ir.expressions.impl +import org.jetbrains.kotlin.ir.expressions.IrExpression import org.jetbrains.kotlin.ir.expressions.IrGetObjectValue import org.jetbrains.kotlin.ir.symbols.IrClassSymbol import org.jetbrains.kotlin.ir.types.IrType @@ -29,4 +30,8 @@ class IrGetObjectValueImpl( ) : IrGetObjectValue() { override fun accept(visitor: IrElementVisitor, data: D): R = visitor.visitGetObjectValue(this, data) + + override fun copy(): IrExpression { + return IrGetObjectValueImpl(startOffset, endOffset, type, symbol) + } } diff --git a/compiler/testData/codegen/box/objects/kt45170.kt b/compiler/testData/codegen/box/objects/kt45170.kt new file mode 100644 index 00000000000..54a12617437 --- /dev/null +++ b/compiler/testData/codegen/box/objects/kt45170.kt @@ -0,0 +1,10 @@ +object A { + var id = 0 + get() = field.also { field++ } +} + +fun box(): String { + if (A.id != 0) return "FAIL1" + if (A.id != 1) return "FAIL2" + return "OK" +} 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 c15ea122d39..4c0105ceeb8 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 @@ -25170,6 +25170,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/objects/kt42758.kt"); } + @Test + @TestMetadata("kt45170.kt") + public void testKt45170() throws Exception { + runTest("compiler/testData/codegen/box/objects/kt45170.kt"); + } + @Test @TestMetadata("kt535.kt") public void testKt535() 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 8d09d622709..0733afc90e8 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 @@ -25170,6 +25170,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/objects/kt42758.kt"); } + @Test + @TestMetadata("kt45170.kt") + public void testKt45170() throws Exception { + runTest("compiler/testData/codegen/box/objects/kt45170.kt"); + } + @Test @TestMetadata("kt535.kt") public void testKt535() 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 fe1e9471ce1..fb4b34cf653 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -21371,6 +21371,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/objects/kt42758.kt"); } + @TestMetadata("kt45170.kt") + public void testKt45170() throws Exception { + runTest("compiler/testData/codegen/box/objects/kt45170.kt"); + } + @TestMetadata("kt535.kt") public void testKt535() throws Exception { runTest("compiler/testData/codegen/box/objects/kt535.kt"); diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java index fb2e84b3364..3ecbdaa17b0 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java @@ -16844,6 +16844,11 @@ public class IrJsCodegenBoxES6TestGenerated extends AbstractIrJsCodegenBoxES6Tes runTest("compiler/testData/codegen/box/objects/kt4086.kt"); } + @TestMetadata("kt45170.kt") + public void testKt45170() throws Exception { + runTest("compiler/testData/codegen/box/objects/kt45170.kt"); + } + @TestMetadata("kt535.kt") public void testKt535() throws Exception { runTest("compiler/testData/codegen/box/objects/kt535.kt"); diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java index 5bd9d8a6b6a..35f7e06519d 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java @@ -16301,6 +16301,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { runTest("compiler/testData/codegen/box/objects/kt4086.kt"); } + @TestMetadata("kt45170.kt") + public void testKt45170() throws Exception { + runTest("compiler/testData/codegen/box/objects/kt45170.kt"); + } + @TestMetadata("kt535.kt") public void testKt535() throws Exception { runTest("compiler/testData/codegen/box/objects/kt535.kt"); diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java index 46ec2671d15..80f3681d58e 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java @@ -16366,6 +16366,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { runTest("compiler/testData/codegen/box/objects/kt4086.kt"); } + @TestMetadata("kt45170.kt") + public void testKt45170() throws Exception { + runTest("compiler/testData/codegen/box/objects/kt45170.kt"); + } + @TestMetadata("kt535.kt") public void testKt535() throws Exception { runTest("compiler/testData/codegen/box/objects/kt535.kt"); diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/wasm/semantics/IrCodegenBoxWasmTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/wasm/semantics/IrCodegenBoxWasmTestGenerated.java index ec3da7e2597..28ecaa0f5b3 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/wasm/semantics/IrCodegenBoxWasmTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/wasm/semantics/IrCodegenBoxWasmTestGenerated.java @@ -10157,6 +10157,11 @@ public class IrCodegenBoxWasmTestGenerated extends AbstractIrCodegenBoxWasmTest runTest("compiler/testData/codegen/box/objects/kt4086.kt"); } + @TestMetadata("kt45170.kt") + public void testKt45170() throws Exception { + runTest("compiler/testData/codegen/box/objects/kt45170.kt"); + } + @TestMetadata("kt694.kt") public void testKt694() throws Exception { runTest("compiler/testData/codegen/box/objects/kt694.kt");