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 01d6002a875..0afe35d3a74 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java @@ -286,6 +286,7 @@ public interface Errors { DiagnosticFactory3.create(ERROR); DiagnosticFactory2 SENSELESS_COMPARISON = DiagnosticFactory2.create(WARNING); + SimpleDiagnosticFactory SENSELESS_NULL_IN_WHEN = SimpleDiagnosticFactory.create(WARNING); DiagnosticFactory2 OVERRIDING_FINAL_MEMBER = DiagnosticFactory2.create(ERROR); DiagnosticFactory3 CANNOT_WEAKEN_ACCESS_PRIVILEGE = diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java index a13d6fa80dd..2ebdebf0349 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java @@ -343,6 +343,7 @@ public class DefaultErrorMessages { }, RENDER_TYPE, RENDER_TYPE); MAP.put(SENSELESS_COMPARISON, "Condition ''{0}'' is always ''{1}''", ELEMENT_TEXT, TO_STRING); + MAP.put(SENSELESS_NULL_IN_WHEN, "Expression under 'when' is never equal to null"); MAP.put(OVERRIDING_FINAL_MEMBER, "''{0}'' in ''{1}'' is final and cannot be overridden", NAME, NAME); MAP.put(CANNOT_WEAKEN_ACCESS_PRIVILEGE, "Cannot weaken access privilege ''{0}'' for ''{1}'' in ''{2}''", TO_STRING, NAME, NAME); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/PatternMatchingTypingVisitor.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/PatternMatchingTypingVisitor.java index f595a08fdc5..550e05fa088 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/PatternMatchingTypingVisitor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/PatternMatchingTypingVisitor.java @@ -330,6 +330,11 @@ public class PatternMatchingTypingVisitor extends ExpressionTypingVisitor { return; } + // check if the pattern is essentially a 'null' expression + if (type == JetStandardClasses.getNullableNothingType() && !subjectType.isNullable()) { + context.trace.report(SENSELESS_NULL_IN_WHEN.on(reportErrorOn)); + } + if (BasicExpressionTypingVisitor.isCastErased(subjectType, type, JetTypeChecker.INSTANCE)) { context.trace.report(Errors.CANNOT_CHECK_FOR_ERASED.on(reportErrorOn, type)); } diff --git a/compiler/testData/diagnostics/tests/nullabilityAndAutoCasts/SenselessNullInWhen.kt b/compiler/testData/diagnostics/tests/nullabilityAndAutoCasts/SenselessNullInWhen.kt new file mode 100644 index 00000000000..8e48d129c13 --- /dev/null +++ b/compiler/testData/diagnostics/tests/nullabilityAndAutoCasts/SenselessNullInWhen.kt @@ -0,0 +1,10 @@ +//KT-2457 Verify error when comparing not null value with null in when + +package kt2457 + +fun foo(i: Int) : Int = + when (i) { + 1 -> 1 + null -> 1 + else -> 1 + } diff --git a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java index ceeede47653..0d1c3cabb0b 100644 --- a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java @@ -1588,6 +1588,11 @@ public class JetDiagnosticsTestGenerated extends AbstractDiagnosticsTestWithEage doTest("compiler/testData/diagnostics/tests/nullabilityAndAutoCasts/ReceiverNullability.kt"); } + @TestMetadata("SenselessNullInWhen.kt") + public void testSenselessNullInWhen() throws Exception { + doTest("compiler/testData/diagnostics/tests/nullabilityAndAutoCasts/SenselessNullInWhen.kt"); + } + } @TestMetadata("compiler/testData/diagnostics/tests/objects")