diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/BasicExpressionTypingVisitor.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/BasicExpressionTypingVisitor.java index 3a1718b44d1..f6eee07a0f0 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/BasicExpressionTypingVisitor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/BasicExpressionTypingVisitor.java @@ -68,7 +68,9 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor { public JetType visitSimpleNameExpression(JetSimpleNameExpression expression, ExpressionTypingContext context) { // TODO : other members // TODO : type substitutions??? - return DataFlowUtils.checkType(getSelectorReturnType(NO_RECEIVER, null, expression, context), expression, context); // TODO : Extensions to this + JetType type = DataFlowUtils.checkType(getSelectorReturnType(NO_RECEIVER, null, expression, context), expression, context); + ExpressionTypingUtils.checkWrappingInRef(expression, context); + return type; // TODO : Extensions to this } private JetType lookupNamespaceOrClassObject(JetSimpleNameExpression expression, String referencedName, ExpressionTypingContext context) { @@ -715,7 +717,6 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor { } else { context.trace.record(BindingContext.VARIABLE_REASSIGNMENT, expression); - ExpressionTypingUtils.checkWrappingInRef(baseExpression, context); checkLValue(context.trace, baseExpression); } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingUtils.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingUtils.java index 085a9cc6511..c1d61912810 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingUtils.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingUtils.java @@ -129,11 +129,9 @@ public class ExpressionTypingUtils { ).contains(expression.getNode().getElementType()); } - public static void checkWrappingInRef(JetExpression expression, ExpressionTypingContext context) { - if (!(expression instanceof JetSimpleNameExpression)) return; - JetSimpleNameExpression simpleName = (JetSimpleNameExpression) expression; - VariableDescriptor variable = BindingContextUtils.extractVariableDescriptorIfAny(context.trace.getBindingContext(), simpleName, true); - if (variable != null) { + public static void checkWrappingInRef(JetSimpleNameExpression expression, ExpressionTypingContext context) { + VariableDescriptor variable = BindingContextUtils.extractVariableDescriptorIfAny(context.trace.getBindingContext(), expression, true); + if (variable != null && variable.isVar()) { DeclarationDescriptor containingDeclaration = variable.getContainingDeclaration(); if (context.scope.getContainingDeclaration() != containingDeclaration && containingDeclaration instanceof CallableDescriptor) { context.trace.record(MUST_BE_WRAPPED_IN_A_REF, variable); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingVisitorForStatements.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingVisitorForStatements.java index 60778cde171..066cfa47c0a 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingVisitorForStatements.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingVisitorForStatements.java @@ -216,7 +216,6 @@ public class ExpressionTypingVisitorForStatements extends ExpressionTypingVisito } else { binaryOperationTrace.commit(); context.trace.record(VARIABLE_REASSIGNMENT, expression); - ExpressionTypingUtils.checkWrappingInRef(expression.getLeft(), context); if (left instanceof JetArrayAccessExpression) { ExpressionTypingContext contextForResolve = context.replaceScope(scope).replaceBindingTrace(TemporaryBindingTrace.create(contextWithExpectedType.trace)); basic.resolveArrayAccessSetMethod((JetArrayAccessExpression) left, expression.getRight(), contextForResolve, context.trace); @@ -244,9 +243,6 @@ public class ExpressionTypingVisitorForStatements extends ExpressionTypingVisito if (leftType != null) { //if leftType == null, some another error has been generated basic.checkLValue(context.trace, expression.getLeft()); } - if (left instanceof JetSimpleNameExpression) { - ExpressionTypingUtils.checkWrappingInRef(left, context); - } return DataFlowUtils.checkStatementType(expression, contextWithExpectedType); } diff --git a/compiler/testData/codegen/regressions/kt1572.jet b/compiler/testData/codegen/regressions/kt1572.jet new file mode 100644 index 00000000000..d3b3c52bde1 --- /dev/null +++ b/compiler/testData/codegen/regressions/kt1572.jet @@ -0,0 +1,23 @@ +//KT-1572 Frontend doesn't mark all vars included in closure as refs. + +class A(val t : Int) {} + +fun testKt1572() : Boolean { + var a = A(0) + var b = A(3) + val changer = {a = b} + b = A(10) // this change has no effect on changer + changer() + return (a.t == 10) +} + +fun testPrimitives() : Boolean { + var a = 0 + var b = 3 + val changer = {a = b} + b = 10 + changer() + return (a == 10) +} + +fun box() = if (testKt1572() && testPrimitives()) "OK" else "fail" diff --git a/compiler/testData/codegen/regressions/kt560.jet b/compiler/testData/codegen/regressions/kt560.jet index cb3944e1f27..29da5fd53ba 100644 --- a/compiler/testData/codegen/regressions/kt560.jet +++ b/compiler/testData/codegen/regressions/kt560.jet @@ -15,7 +15,7 @@ open class AllEvenNum() { } } - (i++) + (i = i + 1) } } diff --git a/compiler/testData/diagnostics/tests/UninitializedOrReassignedVariables.jet b/compiler/testData/diagnostics/tests/UninitializedOrReassignedVariables.jet index 115c131f135..5f5177eebdd 100644 --- a/compiler/testData/diagnostics/tests/UninitializedOrReassignedVariables.jet +++ b/compiler/testData/diagnostics/tests/UninitializedOrReassignedVariables.jet @@ -328,7 +328,7 @@ fun func() { val a = object { val x = b { - b = 4 + b = 4 $b = 3 } } diff --git a/compiler/tests/org/jetbrains/jet/codegen/SafeRefTest.java b/compiler/tests/org/jetbrains/jet/codegen/SafeRefTest.java index b5de9b2e30a..8a579bef218 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/SafeRefTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/SafeRefTest.java @@ -28,4 +28,8 @@ public class SafeRefTest extends CodegenTestCase { public void test232 () throws Exception { blackBoxFile("regressions/kt232.jet"); } + + public void test1572 () throws Exception { + blackBoxFile("regressions/kt1572.jet"); + } } diff --git a/idea/testData/checker/infos/Autocasts.jet b/idea/testData/checker/infos/Autocasts.jet index 4f8ace84cbf..4197d78d269 100644 --- a/idea/testData/checker/infos/Autocasts.jet +++ b/idea/testData/checker/infos/Autocasts.jet @@ -235,8 +235,8 @@ fun mergeAutocasts(a: Any?) { //mutability fun f(): String { - var a: Any = 11 - if (a is String) { + var a: Any = 11 + if (a is String) { val i: String = a a.compareTo("f") val f: Function0 = { a }