diff --git a/compiler/frontend/src/org/jetbrains/kotlin/cfg/JetFlowInformationProvider.java b/compiler/frontend/src/org/jetbrains/kotlin/cfg/JetFlowInformationProvider.java index 5e2f5631e37..3973f48fc88 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/cfg/JetFlowInformationProvider.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/cfg/JetFlowInformationProvider.java @@ -47,6 +47,7 @@ import org.jetbrains.kotlin.cfg.pseudocodeTraverser.Edges; import org.jetbrains.kotlin.cfg.pseudocodeTraverser.PseudocodeTraverserPackage; import org.jetbrains.kotlin.cfg.pseudocodeTraverser.TraversalOrder; import org.jetbrains.kotlin.descriptors.*; +import org.jetbrains.kotlin.descriptors.impl.SyntheticFieldDescriptor; import org.jetbrains.kotlin.diagnostics.Diagnostic; import org.jetbrains.kotlin.diagnostics.DiagnosticFactory; import org.jetbrains.kotlin.diagnostics.Errors; @@ -400,8 +401,11 @@ public class JetFlowInformationProvider { @NotNull Collection varWithValReassignErrorGenerated ) { VariableDescriptor variableDescriptor = ctxt.variableDescriptor; - if (JetPsiUtil.isBackingFieldReference(expression) && variableDescriptor instanceof PropertyDescriptor) { - PropertyDescriptor propertyDescriptor = (PropertyDescriptor) variableDescriptor; + if (variableDescriptor instanceof SyntheticFieldDescriptor + || (JetPsiUtil.isBackingFieldReference(expression) && variableDescriptor instanceof PropertyDescriptor)) { + PropertyDescriptor propertyDescriptor = variableDescriptor instanceof SyntheticFieldDescriptor + ? ((SyntheticFieldDescriptor) variableDescriptor).getPropertyDescriptor() + : (PropertyDescriptor) variableDescriptor; JetPropertyAccessor accessor = PsiTreeUtil.getParentOfType(expression, JetPropertyAccessor.class); if (accessor != null) { DeclarationDescriptor accessorDescriptor = trace.get(BindingContext.DECLARATION_TO_DESCRIPTOR, accessor); diff --git a/compiler/testData/diagnostics/tests/backingField/FieldReassignment.kt b/compiler/testData/diagnostics/tests/backingField/FieldReassignment.kt new file mode 100644 index 00000000000..755979ab00d --- /dev/null +++ b/compiler/testData/diagnostics/tests/backingField/FieldReassignment.kt @@ -0,0 +1,5 @@ +val my: Int = 1 + get() { + field++ + return field + } \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/backingField/FieldReassignment.txt b/compiler/testData/diagnostics/tests/backingField/FieldReassignment.txt new file mode 100644 index 00000000000..4d7f9aba66a --- /dev/null +++ b/compiler/testData/diagnostics/tests/backingField/FieldReassignment.txt @@ -0,0 +1,3 @@ +package + +public val my: kotlin.Int = 1 diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java index 21c27cef42c..cf34c914f3f 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java @@ -1362,6 +1362,12 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest { doTest(fileName); } + @TestMetadata("FieldReassignment.kt") + public void testFieldReassignment() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/backingField/FieldReassignment.kt"); + doTest(fileName); + } + @TestMetadata("FieldShadow.kt") public void testFieldShadow() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/backingField/FieldShadow.kt");