From 4ba94ef69ef2ee576c50bb6003a795746dcdf30d Mon Sep 17 00:00:00 2001 From: Aggelos Biboudis Date: Fri, 1 Dec 2023 07:13:39 +0000 Subject: [PATCH] 8320145: Compiler should accept final variable in Record Pattern Reviewed-by: jlahoda --- .../sun/tools/javac/parser/JavacParser.java | 2 + .../tools/javac/patterns/T8317300.out | 6 +-- .../tools/javac/patterns/T8320145.java | 42 +++++++++++++++++++ 3 files changed, 46 insertions(+), 4 deletions(-) create mode 100644 test/langtools/tools/javac/patterns/T8320145.java 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 bf124bc35bc..977df7759ab 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 @@ -3361,6 +3361,8 @@ public class JavacParser implements Parser { case RPAREN: parenDepth--; break; case ARROW: return parenDepth > 0 ? PatternResult.EXPRESSION : pendingResult; + case FINAL: + if (parenDepth > 0) return PatternResult.PATTERN; default: return pendingResult; } lookahead++; diff --git a/test/langtools/tools/javac/patterns/T8317300.out b/test/langtools/tools/javac/patterns/T8317300.out index f28fd7467d8..6889c873db5 100644 --- a/test/langtools/tools/javac/patterns/T8317300.out +++ b/test/langtools/tools/javac/patterns/T8317300.out @@ -1,5 +1,3 @@ T8317300.java:13:18: compiler.err.mod.not.allowed.here: final -T8317300.java:20:22: compiler.err.illegal.start.of.expr -T8317300.java:20:31: compiler.err.expected: token.identifier -T8317300.java:20:37: compiler.err.expected: ';' -4 errors +T8317300.java:20:22: compiler.err.mod.not.allowed.here: final +2 errors diff --git a/test/langtools/tools/javac/patterns/T8320145.java b/test/langtools/tools/javac/patterns/T8320145.java new file mode 100644 index 00000000000..67c851a82aa --- /dev/null +++ b/test/langtools/tools/javac/patterns/T8320145.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +/* + * @test + * @bug 8320145 + * @summary Compiler should accept final variable in Record Pattern + * @compile T8320145.java + */ +public class T8320145 { + record ARecord(String aComponent) {} + record BRecord(ARecord aComponent) {} + record CRecord(ARecord aComponent1, ARecord aComponent2) {} + + public String match(Object o) { + return switch(o) { + case ARecord(final String s) -> s; + case BRecord(ARecord(final String s)) -> s; + case CRecord(ARecord(String s), ARecord(final String s2)) -> s; + default -> "No match"; + }; + } +}