From 874560df9d1edf198d4f22615d736eb83bce118e Mon Sep 17 00:00:00 2001 From: Michael Bogdanov Date: Mon, 25 Jan 2016 13:26:00 +0300 Subject: [PATCH] Fix for KT-10715: Verify error on incrementing backing field from accessor --- .../jetbrains/kotlin/codegen/StackValue.java | 3 +++ .../impl/SyntheticFieldDescriptor.kt | 4 +++- .../testData/codegen/box/properties/kt10715.kt | 17 +++++++++++++++++ .../generated/BlackBoxCodegenTestGenerated.java | 6 ++++++ 4 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/codegen/box/properties/kt10715.kt diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/StackValue.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/StackValue.java index fe3cc6a3ad1..b6778421218 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/StackValue.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/StackValue.java @@ -516,6 +516,9 @@ public abstract class StackValue { dispatchReceiverParameter = extensionReceiverParameter; extensionReceiverParameter = null; } + else if (descriptor instanceof SyntheticFieldDescriptor) { + dispatchReceiverParameter = ((SyntheticFieldDescriptor) descriptor).getDispatchReceiverParameterForBackend(); + } boolean hasExtensionReceiver = callExtensionReceiver != null; StackValue dispatchReceiver = platformStaticCallIfPresent( diff --git a/compiler/frontend/src/org/jetbrains/kotlin/descriptors/impl/SyntheticFieldDescriptor.kt b/compiler/frontend/src/org/jetbrains/kotlin/descriptors/impl/SyntheticFieldDescriptor.kt index 13e60e7f9be..a8e58de213f 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/descriptors/impl/SyntheticFieldDescriptor.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/descriptors/impl/SyntheticFieldDescriptor.kt @@ -36,7 +36,9 @@ class SyntheticFieldDescriptor private constructor( override fun getDispatchReceiverParameter() = null - fun getDispatchReceiverForBackend() = propertyDescriptor.dispatchReceiverParameter?.value + fun getDispatchReceiverForBackend() = getDispatchReceiverParameterForBackend()?.value + + fun getDispatchReceiverParameterForBackend() = propertyDescriptor.dispatchReceiverParameter companion object { @JvmField diff --git a/compiler/testData/codegen/box/properties/kt10715.kt b/compiler/testData/codegen/box/properties/kt10715.kt new file mode 100644 index 00000000000..7449c1b5bfa --- /dev/null +++ b/compiler/testData/codegen/box/properties/kt10715.kt @@ -0,0 +1,17 @@ +fun box(): String { + var a = Base() + + val count = a.count + if (count != 0) return "fail 1: $count" + + val count2 = a.count + if (count2 != 1) return "fail 2: $count2" + + return "OK" + +} + +class Base { + var count: Int = 0 + get() = field++ +} \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxCodegenTestGenerated.java index d25f0b1c34d..68f0ec1ab23 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxCodegenTestGenerated.java @@ -6697,6 +6697,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { doTest(fileName); } + @TestMetadata("kt10715.kt") + public void testKt10715() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/properties/kt10715.kt"); + doTest(fileName); + } + @TestMetadata("kt1159.kt") public void testKt1159() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/properties/kt1159.kt");