From 783c3d15008c38a42cb6af05d39a1a7156717060 Mon Sep 17 00:00:00 2001 From: pyos Date: Mon, 20 Sep 2021 16:29:31 +0200 Subject: [PATCH] JVM_IR: resolve fake overrides of inline delegated property operators before checking whether they use the KProperty parameter. (Otherwise the body is empty and the check always says that the parameter is unused.) ^KT-48825 Fixed --- .../FirBlackBoxCodegenTestGenerated.java | 6 ++++ .../jvm/lower/PropertyReferenceLowering.kt | 3 +- .../optimizedDelegatedProperties/kt48825.kt | 31 +++++++++++++++++++ .../codegen/BlackBoxCodegenTestGenerated.java | 6 ++++ .../IrBlackBoxCodegenTestGenerated.java | 6 ++++ .../LightAnalysisModeTestGenerated.java | 5 +++ .../IrJsCodegenBoxES6TestGenerated.java | 5 +++ .../IrJsCodegenBoxTestGenerated.java | 5 +++ .../semantics/JsCodegenBoxTestGenerated.java | 5 +++ 9 files changed, 71 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/codegen/box/delegatedProperty/optimizedDelegatedProperties/kt48825.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 8fd79317883..78113e45b72 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 @@ -13879,6 +13879,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/delegatedProperty/optimizedDelegatedProperties/kt42253.kt"); } + @Test + @TestMetadata("kt48825.kt") + public void testKt48825() throws Exception { + runTest("compiler/testData/codegen/box/delegatedProperty/optimizedDelegatedProperties/kt48825.kt"); + } + @Test @TestMetadata("lazy.kt") public void testLazy() throws Exception { diff --git a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/PropertyReferenceLowering.kt b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/PropertyReferenceLowering.kt index 613cb2b52fe..22a9d09d33e 100644 --- a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/PropertyReferenceLowering.kt +++ b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/PropertyReferenceLowering.kt @@ -287,7 +287,8 @@ internal class PropertyReferenceLowering(val context: JvmBackendContext) : IrEle for (index in expression.symbol.owner.valueParameters.indices) { val value = expression.getValueArgument(index) if (value is IrCallableReference<*> && value.origin == IrStatementOrigin.PROPERTY_REFERENCE_FOR_DELEGATE) { - if (!usesPropertyParameterCache.getOrPut(expression.symbol) { expression.symbol.owner.usesParameter(index) }) { + val resolved = expression.symbol.owner.resolveFakeOverride() ?: expression.symbol.owner + if (!usesPropertyParameterCache.getOrPut(resolved.symbol) { resolved.usesParameter(index) }) { expression.putValueArgument(index, IrConstImpl.constNull(value.startOffset, value.endOffset, value.type)) } } diff --git a/compiler/testData/codegen/box/delegatedProperty/optimizedDelegatedProperties/kt48825.kt b/compiler/testData/codegen/box/delegatedProperty/optimizedDelegatedProperties/kt48825.kt new file mode 100644 index 00000000000..40da534b371 --- /dev/null +++ b/compiler/testData/codegen/box/delegatedProperty/optimizedDelegatedProperties/kt48825.kt @@ -0,0 +1,31 @@ +// IGNORE_BACKEND: JVM +// MODULE: lib +// FILE: lib.kt +import kotlin.reflect.KProperty + +open class A { + inline operator fun Int.getValue(thisRef: Any?, property: KProperty<*>): String = + property.name +} + +// MODULE: main(lib) +// FILE: main.kt +import kotlin.reflect.KProperty + +open class B : A() { + var result = "fail" + + inline operator fun String.getValue(thisRef: Any?, property: KProperty<*>): String = + property.name + + inline operator fun String.setValue(thisRef: Any?, property: KProperty<*>, value: String) { + result = this + property.name + } +} + +class C : B() { + val O by 1 + var K by O +} + +fun box() = C().run { K = "..."; result } 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 19dabcd9cb8..cd5b331c9d2 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 @@ -13801,6 +13801,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/delegatedProperty/optimizedDelegatedProperties/kt42253.kt"); } + @Test + @TestMetadata("kt48825.kt") + public void testKt48825() throws Exception { + runTest("compiler/testData/codegen/box/delegatedProperty/optimizedDelegatedProperties/kt48825.kt"); + } + @Test @TestMetadata("lazy.kt") public void testLazy() 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 5ea2b30f22b..6769943a4ee 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 @@ -13879,6 +13879,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/delegatedProperty/optimizedDelegatedProperties/kt42253.kt"); } + @Test + @TestMetadata("kt48825.kt") + public void testKt48825() throws Exception { + runTest("compiler/testData/codegen/box/delegatedProperty/optimizedDelegatedProperties/kt48825.kt"); + } + @Test @TestMetadata("lazy.kt") public void testLazy() 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 fb95f315df0..5a6dceaf4f3 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -11185,6 +11185,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) public static class OptimizedDelegatedProperties extends AbstractLightAnalysisModeTest { + @TestMetadata("kt48825.kt") + public void ignoreKt48825() throws Exception { + runTest("compiler/testData/codegen/box/delegatedProperty/optimizedDelegatedProperties/kt48825.kt"); + } + private void runTest(String testDataFilePath) throws Exception { KotlinTestUtils.runTest(this::doTest, TargetBackend.JVM, testDataFilePath); } 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 8bfdaea319f..e55808958ed 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 @@ -10027,6 +10027,11 @@ public class IrJsCodegenBoxES6TestGenerated extends AbstractIrJsCodegenBoxES6Tes runTest("compiler/testData/codegen/box/delegatedProperty/optimizedDelegatedProperties/kt42253.kt"); } + @TestMetadata("kt48825.kt") + public void testKt48825() throws Exception { + runTest("compiler/testData/codegen/box/delegatedProperty/optimizedDelegatedProperties/kt48825.kt"); + } + @TestMetadata("lazy.kt") public void testLazy() throws Exception { runTest("compiler/testData/codegen/box/delegatedProperty/optimizedDelegatedProperties/lazy.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 9c9202e6638..f62983ee5c7 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 @@ -9433,6 +9433,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { runTest("compiler/testData/codegen/box/delegatedProperty/optimizedDelegatedProperties/kt42253.kt"); } + @TestMetadata("kt48825.kt") + public void testKt48825() throws Exception { + runTest("compiler/testData/codegen/box/delegatedProperty/optimizedDelegatedProperties/kt48825.kt"); + } + @TestMetadata("lazy.kt") public void testLazy() throws Exception { runTest("compiler/testData/codegen/box/delegatedProperty/optimizedDelegatedProperties/lazy.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 118d6477167..61ebd71d6d0 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 @@ -9413,6 +9413,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { runTest("compiler/testData/codegen/box/delegatedProperty/optimizedDelegatedProperties/kt42253.kt"); } + @TestMetadata("kt48825.kt") + public void testKt48825() throws Exception { + runTest("compiler/testData/codegen/box/delegatedProperty/optimizedDelegatedProperties/kt48825.kt"); + } + @TestMetadata("lazy.kt") public void testLazy() throws Exception { runTest("compiler/testData/codegen/box/delegatedProperty/optimizedDelegatedProperties/lazy.kt");