Skip to content

Commit 48760d7

Browse files
biboudislahodaj
authored andcommitted
8312163: Crash in dominance check when compiling unnamed patterns
Reviewed-by: jlahoda Backport-of: 1fc726a
1 parent 8198737 commit 48760d7

File tree

4 files changed

+73
-3
lines changed

4 files changed

+73
-3
lines changed

src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Check.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4733,10 +4733,13 @@ private boolean patternDominated(JCPattern existingPattern, JCPattern currentPat
47334733
return false;
47344734
}
47354735
}
4736-
if (currentPattern instanceof JCBindingPattern) {
4737-
return existingPattern instanceof JCBindingPattern;
4736+
if (currentPattern instanceof JCBindingPattern ||
4737+
currentPattern instanceof JCAnyPattern) {
4738+
return existingPattern instanceof JCBindingPattern ||
4739+
existingPattern instanceof JCAnyPattern;
47384740
} else if (currentPattern instanceof JCRecordPattern currentRecordPattern) {
4739-
if (existingPattern instanceof JCBindingPattern) {
4741+
if (existingPattern instanceof JCBindingPattern ||
4742+
existingPattern instanceof JCAnyPattern) {
47404743
return true;
47414744
} else if (existingPattern instanceof JCRecordPattern existingRecordPattern) {
47424745
List<JCPattern> existingNested = existingRecordPattern.nested;

src/jdk.compiler/share/classes/com/sun/tools/javac/parser/JavacParser.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -879,6 +879,7 @@ public JCPattern parsePattern(int pos, JCModifiers mods, JCExpression parsedType
879879
JCExpression e;
880880
if (token.kind == UNDERSCORE && parsedType == null) {
881881
nextToken();
882+
checkSourceLevel(Feature.UNNAMED_VARIABLES);
882883
pattern = toP(F.at(token.pos).AnyPattern());
883884
}
884885
else {
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
/*
2+
* @test /nodynamiccopyright/
3+
* @bug 8312163
4+
* @summary Crash in dominance check when compiling unnamed patterns
5+
* @enablePreview
6+
* @compile/fail/ref=T8312163.out -XDrawDiagnostics T8312163.java
7+
*/
8+
public class T8312163 {
9+
sealed interface A permits B {}
10+
record B() implements A {}
11+
12+
record Rec(A a, A b) {}
13+
14+
public void test(Rec r)
15+
{
16+
switch (r) {
17+
case Rec(_, _): break;
18+
case Rec(_, B()): // dominated
19+
}
20+
21+
switch (r) {
22+
case Rec(_, B()): break;
23+
case Rec(_, _):
24+
}
25+
26+
switch (r) {
27+
case Rec(_, _): break;
28+
case Rec(_, A a): // dominated
29+
}
30+
31+
switch (r) {
32+
case Rec(_, A a): break;
33+
case Rec(_, _): // dominated
34+
}
35+
36+
// duplicated unnamed patterns with unnamed pattern variables for reference
37+
switch (r) {
38+
case Rec(var _, var _): break;
39+
case Rec(var _, B()): // dominated
40+
}
41+
42+
switch (r) {
43+
case Rec(var _, B()): break;
44+
case Rec(var _, var _):
45+
}
46+
47+
switch (r) {
48+
case Rec(var _, var _): break;
49+
case Rec(var _, A a): // dominated
50+
}
51+
52+
switch (r) {
53+
case Rec(var _, A a): break;
54+
case Rec(var _, var _): // dominated
55+
}
56+
}
57+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
T8312163.java:18:18: compiler.err.pattern.dominated
2+
T8312163.java:28:18: compiler.err.pattern.dominated
3+
T8312163.java:33:18: compiler.err.pattern.dominated
4+
T8312163.java:39:18: compiler.err.pattern.dominated
5+
T8312163.java:49:18: compiler.err.pattern.dominated
6+
T8312163.java:54:18: compiler.err.pattern.dominated
7+
- compiler.note.preview.filename: T8312163.java, DEFAULT
8+
- compiler.note.preview.recompile
9+
6 errors

0 commit comments

Comments
 (0)