From 76845a76b988bd02d3fcbac1711583006b4dc4d8 Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Mon, 21 Jul 2014 13:12:13 +0400 Subject: [PATCH] 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 --- .../ExpressionTypingVisitorForStatements.java | 1 + .../assignmentOperationsCheckReturnType.kt | 48 +++++++++++++++++++ .../checkers/JetDiagnosticsTestGenerated.java | 5 ++ 3 files changed, 54 insertions(+) create mode 100644 compiler/testData/diagnostics/tests/operatorsOverloading/assignmentOperationsCheckReturnType.kt 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 28e9841d690..8bbf7aed6ab 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 @@ -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(); diff --git a/compiler/testData/diagnostics/tests/operatorsOverloading/assignmentOperationsCheckReturnType.kt b/compiler/testData/diagnostics/tests/operatorsOverloading/assignmentOperationsCheckReturnType.kt new file mode 100644 index 00000000000..bf9d9cd5fe4 --- /dev/null +++ b/compiler/testData/diagnostics/tests/operatorsOverloading/assignmentOperationsCheckReturnType.kt @@ -0,0 +1,48 @@ +fun intBinEq() { + var x = 0 + x += 'a' + x += 1.toByte() + x += 1.toShort() + x += 1L + x += 1f + x += 1.0 + x *= 'a' + x *= 1.toByte() + x *= 1.toShort() + x *= 1L + x *= 1f + x *= 1.0 +} + +fun shortBinEq() { + var x = 0.toShort() + x += 'a' + x += 1.toByte() + x += 1.toShort() + x += 1L + x += 1f + x += 1.0 + + x *= 'a' + x *= 1.toByte() + x *= 1.toShort() + x *= 1L + x *= 1f + 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() + z += x +} diff --git a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java index ad4f9eba082..4a61fcf18c5 100644 --- a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java @@ -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");