diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java index 42028fc4d2c..193aac1df0c 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java @@ -380,6 +380,8 @@ public interface Errors { } }, TO_STRING, TO_STRING); + DiagnosticFactory2 SENSELESS_COMPARISON = DiagnosticFactory2.create(WARNING, "Condition ''{0}'' is always ''{1}''", ELEMENT_TEXT, TO_STRING); + DiagnosticFactory2 OVERRIDING_FINAL_MEMBER = DiagnosticFactory2.create(ERROR, "''{0}'' in ''{1}'' is final and cannot be overridden", NAME, NAME); DiagnosticFactory3 CANNOT_WEAKEN_ACCESS_PRIVILEGE = DiagnosticFactory3.create(ERROR, "Cannot weaken access privilege ''{0}'' for ''{1}'' in ''{2}''", PositioningStrategies.POSITION_VISIBILITY_MODIFIER, TO_STRING, NAME, NAME); DiagnosticFactory3 CANNOT_CHANGE_ACCESS_PRIVILEGE = DiagnosticFactory3.create(ERROR, "Cannot change access privilege ''{0}'' for ''{1}'' in ''{2}''", PositioningStrategies.POSITION_VISIBILITY_MODIFIER, TO_STRING, NAME, NAME); 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 66059c490fe..bc932755159 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 @@ -950,9 +950,16 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor { context.trace.report(EQUALITY_NOT_APPLICABLE.on(expression, operationSign, leftType, rightType)); } } + if (isSenselessComparisonWithNull(leftType, right) || isSenselessComparisonWithNull(rightType, left)) { + context.trace.report(SENSELESS_COMPARISON.on(expression, expression, operationSign.getReferencedNameElementType() == JetTokens.EXCLEQ)); + } } } + private boolean isSenselessComparisonWithNull(JetType firstType, JetExpression secondExpression) { + return !firstType.isNullable() && secondExpression instanceof JetConstantExpression && secondExpression.getNode().getElementType() == JetNodeTypes.NULL; + } + protected JetType visitAssignmentOperation(JetBinaryExpression expression, ExpressionTypingContext context) { return assignmentIsNotAnExpressionError(expression, context); } diff --git a/compiler/testData/diagnostics/tests/nullabilityAndAutoCasts/kt1680.jet b/compiler/testData/diagnostics/tests/nullabilityAndAutoCasts/kt1680.jet new file mode 100644 index 00000000000..8b1a7a42ebc --- /dev/null +++ b/compiler/testData/diagnostics/tests/nullabilityAndAutoCasts/kt1680.jet @@ -0,0 +1,14 @@ +//KT-1680 Warn if non-null variable is compared to null +package kt1680 + +fun foo() { + val x = 1 + if (x != null) {} // <-- need a warning here! + if (x == null) {} + if (null != x) {} + if (null == x) {} + + val y : Int? = 1 + if (y != null) {} + if (y == null) {} +} \ No newline at end of file