aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAggelos Biboudis <abimpoudis@openjdk.org>2023-07-19 07:37:21 +0000
committerVitaly Provodin <vitaly.provodin@jetbrains.com>2023-07-22 05:17:33 +0700
commit1d9dde2a3cb6bec468f44f67f1c44c332f1d24da (patch)
tree3d8e35b86b666f213711c5fae5b23896729db1ab
parent1ccadbd33616a449c7fa1635ba37a201de8b21a3 (diff)
downloadJetBrainsRuntime-1d9dde2a3cb6bec468f44f67f1c44c332f1d24da.tar.gz
8312163: Crash in dominance check when compiling unnamed patterns
Reviewed-by: jlahoda Backport-of: 1fc726a8b34fcd41dae12a6d7c63232f9ccef3f4
-rw-r--r--src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Check.java9
-rw-r--r--src/jdk.compiler/share/classes/com/sun/tools/javac/parser/JavacParser.java1
-rw-r--r--test/langtools/tools/javac/T8312163.java57
-rw-r--r--test/langtools/tools/javac/T8312163.out9
4 files changed, 73 insertions, 3 deletions
diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Check.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Check.java
index 57061d38dd8..e6de3f574b3 100644
--- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Check.java
+++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Check.java
@@ -4733,10 +4733,13 @@ public class Check {
return false;
}
}
- if (currentPattern instanceof JCBindingPattern) {
- return existingPattern instanceof JCBindingPattern;
+ if (currentPattern instanceof JCBindingPattern ||
+ currentPattern instanceof JCAnyPattern) {
+ return existingPattern instanceof JCBindingPattern ||
+ existingPattern instanceof JCAnyPattern;
} else if (currentPattern instanceof JCRecordPattern currentRecordPattern) {
- if (existingPattern instanceof JCBindingPattern) {
+ if (existingPattern instanceof JCBindingPattern ||
+ existingPattern instanceof JCAnyPattern) {
return true;
} else if (existingPattern instanceof JCRecordPattern existingRecordPattern) {
List<JCPattern> existingNested = existingRecordPattern.nested;
diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/parser/JavacParser.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/parser/JavacParser.java
index 5cf5a91150c..ff662ac1320 100644
--- a/src/jdk.compiler/share/classes/com/sun/tools/javac/parser/JavacParser.java
+++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/parser/JavacParser.java
@@ -879,6 +879,7 @@ public class JavacParser implements Parser {
JCExpression e;
if (token.kind == UNDERSCORE && parsedType == null) {
nextToken();
+ checkSourceLevel(Feature.UNNAMED_VARIABLES);
pattern = toP(F.at(token.pos).AnyPattern());
}
else {
diff --git a/test/langtools/tools/javac/T8312163.java b/test/langtools/tools/javac/T8312163.java
new file mode 100644
index 00000000000..3554522f401
--- /dev/null
+++ b/test/langtools/tools/javac/T8312163.java
@@ -0,0 +1,57 @@
+/*
+ * @test /nodynamiccopyright/
+ * @bug 8312163
+ * @summary Crash in dominance check when compiling unnamed patterns
+ * @enablePreview
+ * @compile/fail/ref=T8312163.out -XDrawDiagnostics T8312163.java
+ */
+public class T8312163 {
+ sealed interface A permits B {}
+ record B() implements A {}
+
+ record Rec(A a, A b) {}
+
+ public void test(Rec r)
+ {
+ switch (r) {
+ case Rec(_, _): break;
+ case Rec(_, B()): // dominated
+ }
+
+ switch (r) {
+ case Rec(_, B()): break;
+ case Rec(_, _):
+ }
+
+ switch (r) {
+ case Rec(_, _): break;
+ case Rec(_, A a): // dominated
+ }
+
+ switch (r) {
+ case Rec(_, A a): break;
+ case Rec(_, _): // dominated
+ }
+
+ // duplicated unnamed patterns with unnamed pattern variables for reference
+ switch (r) {
+ case Rec(var _, var _): break;
+ case Rec(var _, B()): // dominated
+ }
+
+ switch (r) {
+ case Rec(var _, B()): break;
+ case Rec(var _, var _):
+ }
+
+ switch (r) {
+ case Rec(var _, var _): break;
+ case Rec(var _, A a): // dominated
+ }
+
+ switch (r) {
+ case Rec(var _, A a): break;
+ case Rec(var _, var _): // dominated
+ }
+ }
+}
diff --git a/test/langtools/tools/javac/T8312163.out b/test/langtools/tools/javac/T8312163.out
new file mode 100644
index 00000000000..80ec36552c0
--- /dev/null
+++ b/test/langtools/tools/javac/T8312163.out
@@ -0,0 +1,9 @@
+T8312163.java:18:18: compiler.err.pattern.dominated
+T8312163.java:28:18: compiler.err.pattern.dominated
+T8312163.java:33:18: compiler.err.pattern.dominated
+T8312163.java:39:18: compiler.err.pattern.dominated
+T8312163.java:49:18: compiler.err.pattern.dominated
+T8312163.java:54:18: compiler.err.pattern.dominated
+- compiler.note.preview.filename: T8312163.java, DEFAULT
+- compiler.note.preview.recompile
+6 errors \ No newline at end of file