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);