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:
committed by
Evgeny Gerashchenko
parent
2b67716e95
commit
76845a76b9
+1
@@ -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();
|
||||
|
||||
+48
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user