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 }