diff --git a/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/TypePattern.java b/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/TypePattern.java index 80f226ca1e0..b4609a13231 100644 --- a/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/TypePattern.java +++ b/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/TypePattern.java @@ -202,7 +202,11 @@ public boolean dominates(Pattern p) { return false; if (p.resolvedType == null || this.resolvedType == null) return false; - return p.resolvedType.erasure().isSubtypeOf(this.resolvedType.erasure(), false); + + if (p.resolvedType.isSubtypeOf(this.resolvedType, false)) + return true; + + return p.resolvedType.erasure().findSuperTypeOriginatingFrom(this.resolvedType.erasure()) != null; } @Override 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 caab7826379..23037af7c0d 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 @@ -8864,4 +8864,48 @@ final class A implements I { "Type I cannot be safely cast to B\n" + "----------\n"); } + + // https://github.com/eclipse-jdt/eclipse.jdt.core/issues/3035 + // [switch][sealed types] ECJ fails to signal a completely dominated case arm + public void testIssue3035() { + runNegativeTest( + new String[] { + "X.java", + """ + abstract sealed class J permits X.S, A { + } + + final class A extends J { + } + + public class X { + + sealed class S extends J permits SS { + } + + final class SS extends S {} + + int testExhaustive(J ji) { + return switch (ji) { // Exhaustive! + case A a -> 42; + case S e -> 4200; + case SS e -> 420; + }; + } + + public static void main(String[] args) { + S xs = null; + System.out.println(new X().testExhaustive(new X().new S())); + J ji = new X().new SS(); + } + } + """ + }, + "----------\n" + + "1. ERROR in X.java (at line 18)\n" + + " case SS e -> 420;\n" + + " ^^^^^^^^^^^^^^^^^^^^^\n" + + "This case label is dominated by one of the preceding case labels\n" + + "----------\n"); + } } diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/RunVariousPatternsTests.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/RunVariousPatternsTests.java index 7613e60ac0c..d486b0d4665 100644 --- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/RunVariousPatternsTests.java +++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/RunVariousPatternsTests.java @@ -61,6 +61,8 @@ public static Class[] getAllTestClasses() { NullAnnotationTests21.class, ComplianceDiagnoseTest.class, InstanceofExpressionTest.class, + PrimitiveInPatternsTest.class, + PrimitiveInPatternsTestSH.class, }; }