Bug 575687 - [17][switch pattern] wrongly accepts code that throws CCE
at runtime
Change-Id: I626435668e464ddb243dbae27445309d036bc1e5
Signed-off-by: Jay Arthanareeswaran <jarthana@in.ibm.com>
Reviewed-on: https://git.eclipse.org/r/c/jdt/eclipse.jdt.core/+/184827
Tested-by: JDT Bot <jdt-bot@eclipse.org>
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/SwitchPatternTest.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/SwitchPatternTest.java
index 7c6a603..8bcdae5 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/SwitchPatternTest.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/SwitchPatternTest.java
@@ -3736,8 +3736,6 @@
options);
}
public void testBug575571_2() {
- Map<String, String> options = getCompilerOptions();
- options.put(CompilerOptions.OPTION_ReportMissingDefaultCase, CompilerOptions.WARNING);
runNegativeTest(
new String[] {
"X.java",
@@ -3843,4 +3841,32 @@
},
"Hello");
}
+ public void testBug575687_1() {
+ runNegativeTest(
+ new String[] {
+ "X.java",
+ "public class X {\n" +
+ " static void number(Number i) {\n" +
+ " switch (i) {\n" +
+ " case Integer i2, 4.5:\n" +
+ " case 4.3: System.out.println();\n" +
+ " default: System.out.println(\"nothing\");\n" +
+ " }\n" +
+ " }\n" +
+ " public static void main(String[] args) {}\n" +
+ "}\n" +
+ "enum Color { Blue, Red; }\n",
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 4)\n" +
+ " case Integer i2, 4.5:\n" +
+ " ^^^\n" +
+ "Type mismatch: cannot convert from double to Number\n" +
+ "----------\n" +
+ "2. ERROR in X.java (at line 5)\n" +
+ " case 4.3: System.out.println();\n" +
+ " ^^^\n" +
+ "Type mismatch: cannot convert from double to Number\n" +
+ "----------\n");
+ }
}
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/CaseStatement.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/CaseStatement.java
index 029ff7d..e482b5a 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/CaseStatement.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/CaseStatement.java
@@ -326,8 +326,10 @@
} else if (e instanceof FakeDefaultLiteral) {
continue; // already processed
}
- e.resolveType(scope);
+ caseType = e.resolveType(scope);
}
+ if (caseType == null)
+ return ResolvedCase.UnresolvedCase;
// Avoid further resolution and secondary errors
if (caseType.isValidBinding()) {
Constant con = resolveConstantExpression(scope, caseType, switchExpressionType, switchStatement, e);