Fixed KT-4814: check type when a += b is a = a+b

In cases when a += b is a = a + b, check that (a+b) can be safely casted to a
This commit is contained in:
Denis Zharkov
2014-07-21 13:12:13 +04:00
committed by Evgeny Gerashchenko
parent 2b67716e95
commit 76845a76b9
3 changed files with 54 additions and 0 deletions
@@ -299,6 +299,7 @@ public class ExpressionTypingVisitorForStatements extends ExpressionTypingVisito
basic.resolveArrayAccessSetMethod((JetArrayAccessExpression) left, right, contextForResolve, context.trace);
}
dataFlowInfo = facade.getTypeInfo(right, context.replaceDataFlowInfo(dataFlowInfo)).getDataFlowInfo();
DataFlowUtils.checkType(binaryOperationType, expression, leftType, dataFlowInfo, context.trace);
BasicExpressionTypingVisitor.checkLValue(context.trace, leftOperand);
}
temporary.commit();
@@ -0,0 +1,48 @@
fun intBinEq() {
var x = 0
x += 'a'
x += 1.toByte()
x += 1.toShort()
<!TYPE_MISMATCH!>x += 1L<!>
<!TYPE_MISMATCH!>x += 1f<!>
<!TYPE_MISMATCH!>x += 1.0<!>
x *= 'a'
x *= 1.toByte()
x *= 1.toShort()
<!TYPE_MISMATCH!>x *= 1L<!>
<!TYPE_MISMATCH!>x *= 1f<!>
<!TYPE_MISMATCH!>x *= 1.0<!>
}
fun shortBinEq() {
var x = 0.toShort()
<!TYPE_MISMATCH!>x += 'a'<!>
<!TYPE_MISMATCH!>x += 1.toByte()<!>
<!TYPE_MISMATCH!>x += 1.toShort()<!>
<!TYPE_MISMATCH!>x += 1L<!>
<!TYPE_MISMATCH!>x += 1f<!>
<!TYPE_MISMATCH!>x += 1.0<!>
<!TYPE_MISMATCH!>x *= 'a'<!>
<!TYPE_MISMATCH!>x *= 1.toByte()<!>
<!TYPE_MISMATCH!>x *= 1.toShort()<!>
<!TYPE_MISMATCH!>x *= 1L<!>
<!TYPE_MISMATCH!>x *= 1f<!>
<!TYPE_MISMATCH!>x *= 1.0<!>
}
class A {
fun plus(x : A) : A { return x }
}
class B {
fun plus(x : A) : A { return x }
}
fun overloading() {
var x = A()
var y = A()
x += y
var z = B()
<!TYPE_MISMATCH!>z += x<!>
}
@@ -5909,6 +5909,11 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest {
doTest("compiler/testData/diagnostics/tests/operatorsOverloading/AssignmentOperations.kt");
}
@TestMetadata("assignmentOperationsCheckReturnType.kt")
public void testAssignmentOperationsCheckReturnType() throws Exception {
doTest("compiler/testData/diagnostics/tests/operatorsOverloading/assignmentOperationsCheckReturnType.kt");
}
@TestMetadata("IteratorAmbiguity.kt")
public void testIteratorAmbiguity() throws Exception {
doTest("compiler/testData/diagnostics/tests/operatorsOverloading/IteratorAmbiguity.kt");