Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStephan Herrmann2021-09-11 20:01:12 +0000
committerStephan Herrmann2021-09-19 22:15:35 +0000
commit48090d6c2436b1b06c7441441a36ca196dc867c1 (patch)
tree3e717d49a9e58478f03b62f008a976138337abed /org.eclipse.jdt.core.tests.compiler/src/org/eclipse
parent0f6d49ec3e2f4dd5d270a92dd8551104a7e62f7f (diff)
downloadorg.eclipse.objectteams-48090d6c2436b1b06c7441441a36ca196dc867c1.tar.gz
org.eclipse.objectteams-48090d6c2436b1b06c7441441a36ca196dc867c1.tar.xz
org.eclipse.objectteams-48090d6c2436b1b06c7441441a36ca196dc867c1.zip
Initial merge with BETA_JAVA17 as of Y20210911-0800
Diffstat (limited to 'org.eclipse.jdt.core.tests.compiler/src/org/eclipse')
-rw-r--r--org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/ComplianceDiagnoseTest.java12
-rw-r--r--org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/PatternMatchingSelectionTest.java8
-rw-r--r--org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/TestAll.java50
-rw-r--r--org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AbstractRegressionTest.java44
-rw-r--r--org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AbstractRegressionTest9.java6
-rw-r--r--org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AnnotationTest.java16
-rw-r--r--org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/BatchCompilerTest.java34
-rw-r--r--org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/BatchCompilerTest_16.java2
-rw-r--r--org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/ClassFileReaderTest_17.java (renamed from org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/ClassFileReaderTest_15.java)60
-rw-r--r--org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/CompilerInvocationTests.java32
-rw-r--r--org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/DefaultJavaRuntimeEnvironment.java32
-rw-r--r--org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/DeprecatedTest.java4
-rw-r--r--org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/EnumTest.java41
-rw-r--r--org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/GenericTypeTest.java6
-rw-r--r--org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/InstanceofPrimaryPatternTest.java275
-rw-r--r--org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/InterfaceMethodsTest.java95
-rw-r--r--org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/JavadocTest_1_5.java4
-rw-r--r--org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/LocalStaticsTest.java11
-rw-r--r--org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/ModuleCompilationTests.java6
-rw-r--r--org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/NegativeLambdaExpressionsTest.java18
-rw-r--r--org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/NullAnnotationTests17.java499
-rw-r--r--org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/NullAnnotationTests9.java4
-rw-r--r--org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/PatternMatching16Test.java50
-rw-r--r--org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/PreviewFeatureTest.java49
-rw-r--r--org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/RecordsRestrictedClassTest.java221
-rw-r--r--org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/SealedTypesTests.java427
-rw-r--r--org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/SwitchPatternTest.java4046
-rw-r--r--org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/TestAll.java35
-rw-r--r--org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/ValueBasedAnnotationTests.java15
-rw-r--r--org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/util/AbstractCompilerTest.java24
30 files changed, 5563 insertions, 563 deletions
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/ComplianceDiagnoseTest.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/ComplianceDiagnoseTest.java
index e9ca6bea6..e114d218d 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/ComplianceDiagnoseTest.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/ComplianceDiagnoseTest.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2000, 2020 IBM Corporation and others.
+ * Copyright (c) 2000, 2021 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -8,6 +8,10 @@
*
* SPDX-License-Identifier: EPL-2.0
*
+ * This is an implementation of an early-draft specification developed under the Java
+ * Community Process (JCP) and is made available for testing and evaluation purposes
+ * only. The code is not compatible with any specification of the JCP.
+ *
* Contributors:
* IBM Corporation - initial API and implementation
* Technical University Berlin - adapted for Object Teams
@@ -184,6 +188,7 @@ public void test0002() {
expected15ProblemLog
);
}
+// TODO: Fix this and Enable
public void test0003() {
String[] testFiles = new String[] {
"X.java",
@@ -196,12 +201,7 @@ public void test0003() {
"1. ERROR in X.java (at line 1)\n" +
" public enum X {\n" +
" ^^^^\n" +
-//{ObjectTeams: in non-deterministic choice, OT/J takes other alternative:
-/* orig:
- "Syntax error on token \"enum\", interface expected\n" +
- :giro */
"Syntax error on token \"enum\", class expected\n" +
-// SH}
"----------\n";
String expected14ProblemLog =
expected13ProblemLog;
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/PatternMatchingSelectionTest.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/PatternMatchingSelectionTest.java
index 8cc82646a..94a523263 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/PatternMatchingSelectionTest.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/PatternMatchingSelectionTest.java
@@ -85,7 +85,7 @@ public void test002() throws JavaModelException {
" public X() {\n" +
" }\n" +
" public @SuppressWarnings(\"preview\") void f(Object obj, boolean b) {\n" +
- " final String y_;\n" +
+ " String y_;\n" +
" {\n" +
" <SelectOnName:y_>;\n" +
" }\n" +
@@ -120,7 +120,7 @@ public void test003() throws JavaModelException {
" public X() {\n" +
" }\n" +
" public @SuppressWarnings(\"preview\") void f(Object obj, boolean b) {\n" +
- " final String y_;\n" +
+ " String y_;\n" +
" <SelectOnName:y_>;\n" +
" }\n" +
"}\n";
@@ -142,7 +142,7 @@ public void test004() throws JavaModelException {
+ "}";
String selection = "y_";
- String selectKey = "<SelectionOnLocalName:final String ";
+ String selectKey = "<SelectionOnLocalName:String ";
String expectedSelection = selectKey + selection + ">;";
String selectionIdentifier = "y_";
@@ -151,7 +151,7 @@ public void test004() throws JavaModelException {
" public X() {\n" +
" }\n" +
" public @SuppressWarnings(\"preview\") void f(Object obj, boolean b) {\n" +
- " <SelectionOnLocalName:final String y_>;\n" +
+ " <SelectionOnLocalName:String y_>;\n" +
" }\n" +
"}\n";
String expectedReplacedSource = "y_";
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/TestAll.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/TestAll.java
index 283201298..84a0b6abd 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/TestAll.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/TestAll.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2000, 2020 IBM Corporation and others.
+ * Copyright (c) 2000, 2021 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -266,7 +266,6 @@ public static TestSuite getTestSuite(boolean addComplianceDiagnoseTest) {
tests_15.add(SelectionParserTest12.class);
tests_15.add(ModuleDeclarationSyntaxTest.class);
tests_15.add(JEP286ReservedWordTest.class);
- tests_15.add(PatternMatchingSelectionTest.class);
// Reset forgotten subsets tests
TestCase.TESTS_PREFIX = null;
TestCase.TESTS_NAMES = null;
@@ -275,6 +274,53 @@ public static TestSuite getTestSuite(boolean addComplianceDiagnoseTest) {
TestCase.RUN_ONLY_ID = null;
all.addTest(AbstractCompilerTest.buildComplianceTestSuite(ClassFileConstants.getComplianceLevelForJavaVersion(ClassFileConstants.MAJOR_VERSION_15), tests_15));
}
+ if ((possibleComplianceLevels & AbstractCompilerTest.F_16) != 0) {
+ ArrayList tests_16 = (ArrayList)testClasses.clone();
+ tests_16.addAll(TEST_CLASSES_1_5);
+ tests_16.add(ParserTest1_7.class);
+ tests_16.add(LambdaExpressionSyntaxTest.class);
+ tests_16.add(ReferenceExpressionSyntaxTest.class);
+ tests_16.add(TypeAnnotationSyntaxTest.class);
+ tests_16.add(CompletionParserTest18.class);
+ tests_16.add(SelectionParserTest18.class);
+ tests_16.add(SelectionParserTest9.class);
+ tests_16.add(SelectionParserTest10.class);
+ tests_16.add(SelectionParserTest12.class);
+ tests_16.add(ModuleDeclarationSyntaxTest.class);
+ tests_16.add(JEP286ReservedWordTest.class);
+ tests_16.add(PatternMatchingSelectionTest.class);
+ // Reset forgotten subsets tests
+ TestCase.TESTS_PREFIX = null;
+ TestCase.TESTS_NAMES = null;
+ TestCase.TESTS_NUMBERS= null;
+ TestCase.TESTS_RANGE = null;
+ TestCase.RUN_ONLY_ID = null;
+
+ all.addTest(AbstractCompilerTest.buildComplianceTestSuite(ClassFileConstants.getComplianceLevelForJavaVersion(ClassFileConstants.MAJOR_VERSION_16), tests_16));
+ }
+ if ((possibleComplianceLevels & AbstractCompilerTest.F_17) != 0) {
+ ArrayList tests_17 = (ArrayList)testClasses.clone();
+ tests_17.addAll(TEST_CLASSES_1_5);
+ tests_17.add(ParserTest1_7.class);
+ tests_17.add(LambdaExpressionSyntaxTest.class);
+ tests_17.add(ReferenceExpressionSyntaxTest.class);
+ tests_17.add(TypeAnnotationSyntaxTest.class);
+ tests_17.add(CompletionParserTest18.class);
+ tests_17.add(SelectionParserTest18.class);
+ tests_17.add(SelectionParserTest9.class);
+ tests_17.add(SelectionParserTest10.class);
+ tests_17.add(SelectionParserTest12.class);
+ tests_17.add(ModuleDeclarationSyntaxTest.class);
+ tests_17.add(JEP286ReservedWordTest.class);
+ tests_17.add(PatternMatchingSelectionTest.class);
+ // Reset forgotten subsets tests
+ TestCase.TESTS_PREFIX = null;
+ TestCase.TESTS_NAMES = null;
+ TestCase.TESTS_NUMBERS= null;
+ TestCase.TESTS_RANGE = null;
+ TestCase.RUN_ONLY_ID = null;
+ all.addTest(AbstractCompilerTest.buildComplianceTestSuite(ClassFileConstants.getComplianceLevelForJavaVersion(ClassFileConstants.MAJOR_VERSION_17), tests_17));
+ }
return all;
}
public static Test suite() {
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AbstractRegressionTest.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AbstractRegressionTest.java
index deab03b5f..71c673a45 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AbstractRegressionTest.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AbstractRegressionTest.java
@@ -8,6 +8,10 @@
*
* SPDX-License-Identifier: EPL-2.0
*
+ * This is an implementation of an early-draft specification developed under the Java
+ * Community Process (JCP) and is made available for testing and evaluation purposes
+ * only. The code is not compatible with any specification of the JCP.
+ *
* Contributors:
* IBM Corporation - initial API and implementation
* Technical University Berlin - adapted for Object Teams
@@ -310,6 +314,8 @@ static class JavacCompiler {
return JavaCore.VERSION_15;
} else if(rawVersion.startsWith("16")) {
return JavaCore.VERSION_16;
+ } else if(rawVersion.startsWith("17")) {
+ return JavaCore.VERSION_17;
} else {
throw new RuntimeException("unknown javac version: " + rawVersion);
}
@@ -493,6 +499,20 @@ static class JavacCompiler {
return 0200;
}
}
+ if (version == JavaCore.VERSION_17) {
+ if ("17-ea".equals(rawVersion)) {
+ return 0000;
+ }
+ if ("17".equals(rawVersion)) {
+ return 0000;
+ }
+ if ("17.0.1".equals(rawVersion)) {
+ return 0100;
+ }
+ if ("17.0.2".equals(rawVersion)) {
+ return 0200;
+ }
+ }
throw new RuntimeException("unknown raw javac version: " + rawVersion);
}
// returns 0L if everything went fine; else the lower word contains the
@@ -1634,19 +1654,28 @@ protected static class JavacTestOptions {
return null;
}
- protected INameEnvironment[] getClassLibs(boolean useDefaultClasspaths) {
+ protected INameEnvironment[] getClassLibs(boolean useDefaultClasspaths, Map<String, String> options) {
+ if (options == null)
+ options = getCompilerOptions();
String encoding = getCompilerOptions().get(CompilerOptions.OPTION_Encoding);
if ("".equals(encoding))
encoding = null;
+ String release = null;
+ if (CompilerOptions.ENABLED.equals(options.get(CompilerOptions.OPTION_Release))) {
+ release = getCompilerOptions().get(CompilerOptions.OPTION_Compliance);
+ }
if (useDefaultClasspaths && encoding == null)
- return DefaultJavaRuntimeEnvironment.create(this.classpaths);
+ return DefaultJavaRuntimeEnvironment.create(this.classpaths, release);
// fall back to FileSystem
INameEnvironment[] classLibs = new INameEnvironment[1];
classLibs[0] = new FileSystem(this.classpaths, new String[]{}, // ignore initial file names
- encoding // default encoding
+ encoding, release
);
return classLibs;
}
+ protected INameEnvironment[] getClassLibs(boolean useDefaultClasspaths) {
+ return getClassLibs(useDefaultClasspaths, null);
+ }
@Override
protected Map<String, String> getCompilerOptions() {
Map<String, String> defaultOptions = super.getCompilerOptions();
@@ -1728,9 +1757,12 @@ protected static class JavacTestOptions {
/*
* Will consider first the source units passed as arguments, then investigate the classpath: jdklib + output dir
*/
- protected INameEnvironment getNameEnvironment(final String[] testFiles, String[] classPaths) {
+ protected INameEnvironment getNameEnvironment(final String[] testFiles, String[] classPaths, Map<String, String> options) {
this.classpaths = classPaths == null ? getDefaultClassPaths() : classPaths;
- return new InMemoryNameEnvironment(testFiles, getClassLibs(classPaths == null));
+ return new InMemoryNameEnvironment(testFiles, getClassLibs((classPaths == null), options));
+ }
+ protected INameEnvironment getNameEnvironment(final String[] testFiles, String[] classPaths) {
+ return getNameEnvironment(testFiles, classPaths, null);
}
protected IProblemFactory getProblemFactory() {
return new DefaultProblemFactory(Locale.getDefault());
@@ -3445,7 +3477,7 @@ protected void runNegativeTest(boolean skipJavac, JavacTestOptions javacTestOpti
CompilerOptions compilerOptions = new CompilerOptions(options);
compilerOptions.performMethodsFullRecovery = performStatementsRecovery;
compilerOptions.performStatementsRecovery = performStatementsRecovery;
- INameEnvironment nameEnvironment = getNameEnvironment(dependantFiles, classLibraries);
+ INameEnvironment nameEnvironment = getNameEnvironment(dependantFiles, classLibraries, options);
Compiler batchCompiler =
new Compiler(
nameEnvironment,
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AbstractRegressionTest9.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AbstractRegressionTest9.java
index c2761d86d..ecfbe4cbb 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AbstractRegressionTest9.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AbstractRegressionTest9.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2017, 2018 GK Software AG, and others.
+ * Copyright (c) 2017, 2021 GK Software AG, and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -50,9 +50,9 @@ public class AbstractRegressionTest9 extends AbstractRegressionTest {
}
@Override
- protected INameEnvironment getNameEnvironment(final String[] testFiles, String[] classPaths) {
+ protected INameEnvironment getNameEnvironment(final String[] testFiles, String[] classPaths, Map<String, String> options) {
this.classpaths = classPaths == null ? getDefaultClassPaths() : classPaths;
- INameEnvironment[] classLibs = getClassLibs(classPaths == null);
+ INameEnvironment[] classLibs = getClassLibs(classPaths == null, options);
for (INameEnvironment nameEnvironment : classLibs) {
((FileSystem) nameEnvironment).scanForModules(createParser());
}
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AnnotationTest.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AnnotationTest.java
index eaebd5792..a656fa296 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AnnotationTest.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AnnotationTest.java
@@ -106,12 +106,12 @@ public class AnnotationTest extends AbstractComparableTest {
return options;
}
@Override
- protected INameEnvironment getNameEnvironment(String[] testFiles, String[] classPaths) {
+ protected INameEnvironment getNameEnvironment(String[] testFiles, String[] classPaths, Map<String, String> options) {
if (this.javaClassLib != null) {
this.classpaths = classPaths == null ? getDefaultClassPaths() : classPaths;
return new InMemoryNameEnvironment(testFiles, new INameEnvironment[] {this.javaClassLib });
}
- return super.getNameEnvironment(testFiles, classPaths);
+ return super.getNameEnvironment(testFiles, classPaths, options);
}
/* (non-Javadoc)
@@ -1077,6 +1077,13 @@ public class AnnotationTest extends AbstractComparableTest {
// check annotation member modifiers (validity unchanged despite grammar change from JSR 335 - default methods)
// and https://bugs.eclipse.org/bugs/show_bug.cgi?id=3383968
public void test039a() {
+ String extra = this.complianceLevel < ClassFileConstants.JDK17 ? "" :
+ "----------\n" +
+ "1. WARNING in X.java (at line 2)\n" +
+ " strictfp double val() default 0.1;\n" +
+ " ^^^^^^^^\n" +
+ "Floating-point expressions are always strictly evaluated from source level 17. Keyword \'strictfp\' is not required.\n";
+ int offset = this.complianceLevel < ClassFileConstants.JDK17 ? 0 : 1;
this.runNegativeTest(
new String[] {
"X.java",
@@ -1085,13 +1092,14 @@ public class AnnotationTest extends AbstractComparableTest {
" synchronized String id() default \"zero\";\n" +
"}"
},
+ extra +
"----------\n" +
- "1. ERROR in X.java (at line 2)\n" +
+ (1 + offset) + ". ERROR in X.java (at line 2)\n" +
" strictfp double val() default 0.1;\n" +
" ^^^^^\n" +
"Illegal modifier for the annotation attribute X.val; only public & abstract are permitted\n" +
"----------\n" +
- "2. ERROR in X.java (at line 3)\n" +
+ (2 + offset) + ". ERROR in X.java (at line 3)\n" +
" synchronized String id() default \"zero\";\n" +
" ^^^^\n" +
"Illegal modifier for the annotation attribute X.id; only public & abstract are permitted\n" +
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/BatchCompilerTest.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/BatchCompilerTest.java
index 4250a242f..02bbb853d 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/BatchCompilerTest.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/BatchCompilerTest.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2000, 2020 IBM Corporation and others.
+ * Copyright (c) 2000, 2021 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -8,6 +8,10 @@
*
* SPDX-License-Identifier: EPL-2.0
*
+ * This is an implementation of an early-draft specification developed under the Java
+ * Community Process (JCP) and is made available for testing and evaluation purposes
+ * only. The code is not compatible with any specification of the JCP.
+ *
* Contributors:
* IBM Corporation - initial API and implementation
* Benjamin Muskalla - Contribution for bug 239066
@@ -60,8 +64,10 @@ import org.eclipse.jdt.internal.compiler.batch.ClasspathDirectory;
import org.eclipse.jdt.internal.compiler.batch.ClasspathJar;
import org.eclipse.jdt.internal.compiler.batch.FileSystem;
import org.eclipse.jdt.internal.compiler.batch.Main;
+import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;
import org.eclipse.jdt.internal.compiler.batch.FileSystem.Classpath;
import org.eclipse.jdt.internal.compiler.env.NameEnvironmentAnswer;
+import org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
import org.eclipse.jdt.internal.compiler.lookup.TypeConstants;
import org.eclipse.jdt.internal.compiler.util.ManifestAnalyzer;
@@ -594,6 +600,14 @@ public void test011_classpath(){
"",
true);
}
+private String getVersionOptions() {
+ StringBuilder builder = new StringBuilder();
+ String template = " -15 -15.0 use 15 compliance (-source 15 -target 15)\n";
+ for(int i = ClassFileConstants.MAJOR_VERSION_15; i <= ClassFileConstants.MAJOR_LATEST_VERSION; i++) {
+ builder.append(template.replace("15", "" + (i - ClassFileConstants.MAJOR_VERSION_0)));
+ }
+ return builder.toString();
+}
// command line - help
// amended for https://bugs.eclipse.org/bugs/show_bug.cgi?id=141512 (checking
// width)
@@ -679,11 +693,10 @@ public void test012(){
" -12 -12.0 use 12 compliance (-source 12 -target 12)\n" +
" -13 -13.0 use 13 compliance (-source 13 -target 13)\n" +
" -14 -14.0 use 14 compliance (-source 14 -target 14)\n" +
- " -15 -15.0 use 15 compliance (-source 15 -target 15)\n" +
- " -16 -16.0 use 16 compliance (-source 16 -target 16)\n" +
- " -source <version> set source level: 1.3 to 1.9, 10 to 16\n" +
+ getVersionOptions() +
+ " -source <version> set source level: 1.3 to 1.9, 10 to "+ CompilerOptions.getLatestVersion() +"\n" +
" (or 6, 6.0, etc)\n" +
- " -target <version> set classfile target: 1.3 to 1.9, 10 to 16\n" +
+ " -target <version> set classfile target: 1.3 to 1.9, 10 to "+ CompilerOptions.getLatestVersion() +"\n" +
" (or 6, 6.0, etc)\n" +
" cldc1.1 can also be used to generate the StackMap\n" +
" attribute\n" +
@@ -13304,4 +13317,15 @@ public void testUnusedObjectAllocation() {
true);
}
+public void testBug573153() {
+ String output = MAIN.bind("configure.source", "10");
+ String template = "source level should be in '1.1'...'1.8','9'...'15' (or '5.0'..'15.0'): 10";
+ template = template.replace("15", CompilerOptions.getLatestVersion());
+ assertEquals("configure.source is not updated", template, output);
+
+ output = MAIN.bind("configure.targetJDK", "10");
+ template = "target level should be in '1.1'...'1.8','9'...'15' (or '5.0'..'15.0') or cldc1.1: 10";
+ template = template.replace("15", CompilerOptions.getLatestVersion());
+ assertEquals("configure.source is not updated", template, output);
+}
}
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/BatchCompilerTest_16.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/BatchCompilerTest_16.java
index caa176c1a..d60df4fa0 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/BatchCompilerTest_16.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/BatchCompilerTest_16.java
@@ -86,8 +86,6 @@ public class BatchCompilerTest_16 extends AbstractBatchCompilerTest {
}
}
public void testBug570399(){
- if (!AbstractBatchCompilerTest.isJREVersionEqualTo(CompilerOptions.VERSION_16))
- return;
this.runConformTest(
new String[] {
"src/X.java",
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/ClassFileReaderTest_15.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/ClassFileReaderTest_17.java
index eb0282da2..716d00665 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/ClassFileReaderTest_15.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/ClassFileReaderTest_17.java
@@ -1,16 +1,18 @@
/*******************************************************************************
- * Copyright (c) 2013, 2020 GoPivotal, Inc and others
- *
- * This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License 2.0
+ * Copyright (c) 2020, 2021 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
+ * This is an implementation of an early-draft specification developed under the Java
+ * Community Process (JCP) and is made available for testing and evaluation purposes
+ * only. The code is not compatible with any specification of the JCP.
+ *
* Contributors:
- * Andy Clement (GoPivotal, Inc) aclement@gopivotal.com - Contributions for
- * Bug 407191 - [1.8] Binary access support for type annotations
+ * IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jdt.core.tests.compiler.regression;
@@ -18,21 +20,22 @@ import junit.framework.Test;
import org.eclipse.jdt.core.compiler.CharOperation;
import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;
+import org.eclipse.jdt.internal.compiler.env.IBinaryMethod;
import org.eclipse.jdt.internal.compiler.lookup.ExtraCompilerModifiers;
@SuppressWarnings({ "rawtypes" })
-public class ClassFileReaderTest_15 extends AbstractRegressionTest {
+public class ClassFileReaderTest_17 extends AbstractRegressionTest {
static {
}
public static Test suite() {
- return buildMinimalComplianceTestSuite(testClass(), F_15);
+ return buildMinimalComplianceTestSuite(testClass(), F_17);
}
public static Class testClass() {
- return ClassFileReaderTest_15.class;
+ return ClassFileReaderTest_17.class;
}
- public ClassFileReaderTest_15(String name) {
+ public ClassFileReaderTest_17(String name) {
super(name);
}
@@ -40,8 +43,7 @@ public class ClassFileReaderTest_15 extends AbstractRegressionTest {
@Override
protected void setUp() throws Exception {
super.setUp();
- this.complianceLevel = ClassFileConstants.JDK16;
- this.enablePreview = true;
+ this.complianceLevel = ClassFileConstants.JDK17;
}
public void testBug564227_001() throws Exception {
@@ -107,4 +109,38 @@ public class ClassFileReaderTest_15 extends AbstractRegressionTest {
int modifiers = classFileReader.getModifiers();
assertTrue("sealed modifier expected", (modifiers & ExtraCompilerModifiers.AccSealed) != 0);
}
+ public void testBug545510_1() throws Exception {
+ String source =
+ "strictfp class X {\n"+
+ "}";
+
+ org.eclipse.jdt.internal.compiler.classfmt.ClassFileReader classFileReader = getInternalClassFile("", "X", "X", source);
+
+ int modifiers = classFileReader.getModifiers();
+ assertTrue("strictfp modifier not expected", (modifiers & ClassFileConstants.AccStrictfp) == 0);
+ }
+ public void testBug545510_2() throws Exception {
+ String source =
+ "class X {\n"+
+ " strictfp void foo() {}\n"+
+ "}";
+
+ org.eclipse.jdt.internal.compiler.classfmt.ClassFileReader classFileReader = getInternalClassFile("", "X", "X", source);
+ IBinaryMethod[] methods = classFileReader.getMethods();
+ IBinaryMethod method = methods[1];
+ int modifiers = method.getModifiers();
+ assertTrue("strictfp modifier not expected", (modifiers & ClassFileConstants.AccStrictfp) == 0);
+ }
+ public void testBug545510_3() throws Exception {
+ String source =
+ "strictfp class X {\n"+
+ " void foo() {}\n"+
+ "}";
+
+ org.eclipse.jdt.internal.compiler.classfmt.ClassFileReader classFileReader = getInternalClassFile("", "X", "X", source);
+ IBinaryMethod[] methods = classFileReader.getMethods();
+ IBinaryMethod method = methods[1];
+ int modifiers = method.getModifiers();
+ assertTrue("strictfp modifier not expected", (modifiers & ClassFileConstants.AccStrictfp) == 0);
+ }
}
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/CompilerInvocationTests.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/CompilerInvocationTests.java
index 0b1310a34..a657031b6 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/CompilerInvocationTests.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/CompilerInvocationTests.java
@@ -8,6 +8,10 @@
*
* SPDX-License-Identifier: EPL-2.0
*
+ * This is an implementation of an early-draft specification developed under the Java
+ * Community Process (JCP) and is made available for testing and evaluation purposes
+ * only. The code is not compatible with any specification of the JCP.
+ *
* Contributors:
* IBM Corporation - initial API and implementation
* Benjamin Muskalla - Contribution for bug 239066
@@ -560,6 +564,7 @@ public void _test011_problem_categories() {
expectedProblemAttributes.put("IllegalModifierForArgument", new ProblemAttributes(CategorizedProblem.CAT_MEMBER));
expectedProblemAttributes.put("IllegalModifierForClass", new ProblemAttributes(CategorizedProblem.CAT_TYPE));
expectedProblemAttributes.put("IllegalModifierForConstructor", new ProblemAttributes(CategorizedProblem.CAT_MEMBER));
+ expectedProblemAttributes.put("StrictfpNotRequired", new ProblemAttributes(CategorizedProblem.CAT_SYNTAX));
expectedProblemAttributes.put("IllegalModifierForEnum", new ProblemAttributes(CategorizedProblem.CAT_TYPE));
expectedProblemAttributes.put("IllegalModifierForEnumConstant", new ProblemAttributes(CategorizedProblem.CAT_MEMBER));
expectedProblemAttributes.put("IllegalModifierForEnumConstructor", new ProblemAttributes(CategorizedProblem.CAT_MEMBER));
@@ -1103,6 +1108,7 @@ public void _test011_problem_categories() {
expectedProblemAttributes.put("UnnecessaryElse", new ProblemAttributes(CategorizedProblem.CAT_UNNECESSARY_CODE));
expectedProblemAttributes.put("UnnecessaryInstanceof", new ProblemAttributes(CategorizedProblem.CAT_UNNECESSARY_CODE));
expectedProblemAttributes.put("UnnecessaryNLSTag", new ProblemAttributes(CategorizedProblem.CAT_NLS));
+ expectedProblemAttributes.put("UnnecessaryNullCaseInSwitchOverNonNull", new ProblemAttributes(CategorizedProblem.CAT_POTENTIAL_PROGRAMMING_PROBLEM));
expectedProblemAttributes.put("UnqualifiedFieldAccess", new ProblemAttributes(CategorizedProblem.CAT_CODE_STYLE));
expectedProblemAttributes.put("UnreachableCatch", new ProblemAttributes(CategorizedProblem.CAT_TYPE));
expectedProblemAttributes.put("UnresolvedVariable", new ProblemAttributes(CategorizedProblem.CAT_MEMBER));
@@ -1376,10 +1382,22 @@ public void _test011_problem_categories() {
expectedProblemAttributes.put("SealedNotDirectSuperInterface", new ProblemAttributes(CategorizedProblem.CAT_PREVIEW_RELATED));
expectedProblemAttributes.put("SealedLocalDirectSuperTypeSealed", new ProblemAttributes(CategorizedProblem.CAT_PREVIEW_RELATED));
expectedProblemAttributes.put("SealedAnonymousClassCannotExtendSealedType", new ProblemAttributes(CategorizedProblem.CAT_PREVIEW_RELATED));
+ expectedProblemAttributes.put("LocalReferencedInGuardMustBeEffectivelyFinal", new ProblemAttributes(CategorizedProblem.CAT_PREVIEW_RELATED));
expectedProblemAttributes.put("SealedSuperTypeInDifferentPackage", new ProblemAttributes(CategorizedProblem.CAT_PREVIEW_RELATED));
expectedProblemAttributes.put("SealedSuperTypeDisallowed", new ProblemAttributes(CategorizedProblem.CAT_PREVIEW_RELATED));
expectedProblemAttributes.put("SafeVarargsOnSyntheticRecordAccessor", new ProblemAttributes(true));
expectedProblemAttributes.put("DiscouragedValueBasedTypeSynchronization", new ProblemAttributes(true));
+ expectedProblemAttributes.put("SwitchPatternConstantWithPatternIncompatible", new ProblemAttributes(true));
+ expectedProblemAttributes.put("IllegalFallthroughToPattern", new ProblemAttributes(true));
+ expectedProblemAttributes.put("SwitchPatternOnlyOnePatternCaseLabelAllowed", new ProblemAttributes(true));
+ expectedProblemAttributes.put("SwitchPatternBothPatternAndDefaultCaseLabelsNotAllowed", new ProblemAttributes(true));
+ expectedProblemAttributes.put("SwitchPatternBothNullAndNonTypePatternNotAllowed", new ProblemAttributes(true));
+ expectedProblemAttributes.put("PatternDominated", new ProblemAttributes(true));
+ expectedProblemAttributes.put("IllegalTotalPatternWithDefault", new ProblemAttributes(true));
+ expectedProblemAttributes.put("EnhancedSwitchMissingDefaultCase", new ProblemAttributes(true));
+ expectedProblemAttributes.put("DuplicateTotalPattern", new ProblemAttributes(true));
+ expectedProblemAttributes.put("UnexpectedTypeinSwitchPattern", new ProblemAttributes(true));
+
StringBuffer failures = new StringBuffer();
StringBuffer correctResult = new StringBuffer(70000);
Field[] fields = (iProblemClass = IProblem.class).getFields();
@@ -1706,6 +1724,7 @@ public void test012_compiler_problems_tuning() {
expectedProblemAttributes.put("IllegalModifierForArgument", SKIP);
expectedProblemAttributes.put("IllegalModifierForClass", SKIP);
expectedProblemAttributes.put("IllegalModifierForConstructor", SKIP);
+ expectedProblemAttributes.put("StrictfpNotRequired", SKIP);
expectedProblemAttributes.put("IllegalModifierForEnum", SKIP);
expectedProblemAttributes.put("IllegalModifierForEnumConstant", SKIP);
expectedProblemAttributes.put("IllegalModifierForEnumConstructor", SKIP);
@@ -2252,6 +2271,7 @@ public void test012_compiler_problems_tuning() {
expectedProblemAttributes.put("UnnecessaryElse", new ProblemAttributes(JavaCore.COMPILER_PB_UNNECESSARY_ELSE));
expectedProblemAttributes.put("UnnecessaryInstanceof", new ProblemAttributes(JavaCore.COMPILER_PB_UNNECESSARY_TYPE_CHECK));
expectedProblemAttributes.put("UnnecessaryNLSTag", new ProblemAttributes(JavaCore.COMPILER_PB_NON_NLS_STRING_LITERAL));
+ expectedProblemAttributes.put("UnnecessaryNullCaseInSwitchOverNonNull", new ProblemAttributes(JavaCore.COMPILER_PB_REDUNDANT_NULL_CHECK));
expectedProblemAttributes.put("UnqualifiedFieldAccess", new ProblemAttributes(JavaCore.COMPILER_PB_UNQUALIFIED_FIELD_ACCESS));
expectedProblemAttributes.put("UnreachableCatch", SKIP);
expectedProblemAttributes.put("UnresolvedVariable", SKIP);
@@ -3062,8 +3082,20 @@ public void test012_compiler_problems_tuning() {
expectedProblemAttributes.put("SealedSuperTypeInDifferentPackage", SKIP);
expectedProblemAttributes.put("SealedSuperTypeDisallowed", SKIP);
expectedProblemAttributes.put("SealedAnonymousClassCannotExtendSealedType", SKIP);
+ expectedProblemAttributes.put("LocalReferencedInGuardMustBeEffectivelyFinal", SKIP);
expectedProblemAttributes.put("SafeVarargsOnSyntheticRecordAccessor", SKIP);
expectedProblemAttributes.put("DiscouragedValueBasedTypeSynchronization", SKIP);
+ expectedProblemAttributes.put("SwitchPatternConstantWithPatternIncompatible", SKIP);
+ expectedProblemAttributes.put("IllegalFallthroughToPattern", SKIP);
+ expectedProblemAttributes.put("SwitchPatternOnlyOnePatternCaseLabelAllowed", SKIP);
+ expectedProblemAttributes.put("SwitchPatternBothPatternAndDefaultCaseLabelsNotAllowed", SKIP);
+ expectedProblemAttributes.put("SwitchPatternBothNullAndNonTypePatternNotAllowed", SKIP);
+ expectedProblemAttributes.put("PatternDominated", SKIP);
+ expectedProblemAttributes.put("IllegalTotalPatternWithDefault", SKIP);
+ expectedProblemAttributes.put("EnhancedSwitchMissingDefaultCase", SKIP);
+ expectedProblemAttributes.put("DuplicateTotalPattern", SKIP);
+ expectedProblemAttributes.put("UnexpectedTypeinSwitchPattern", SKIP);
+
Map constantNamesIndex = new HashMap();
Field[] fields = JavaCore.class.getFields();
for (int i = 0, length = fields.length; i < length; i++) {
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/DefaultJavaRuntimeEnvironment.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/DefaultJavaRuntimeEnvironment.java
index c99c66ed7..ac050e9ba 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/DefaultJavaRuntimeEnvironment.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/DefaultJavaRuntimeEnvironment.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2012 IBM Corporation and others.
+ * Copyright (c) 2021 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -13,25 +13,49 @@
*******************************************************************************/
package org.eclipse.jdt.core.tests.compiler.regression;
+import java.io.File;
import java.util.Iterator;
import java.util.Map.Entry;
import org.eclipse.jdt.core.tests.util.Util;
import org.eclipse.jdt.internal.compiler.batch.FileSystem;
import org.eclipse.jdt.internal.compiler.env.INameEnvironment;
+import org.eclipse.jdt.internal.compiler.util.JRTUtil;
public class DefaultJavaRuntimeEnvironment extends FileSystem {
- private DefaultJavaRuntimeEnvironment(String[] jreClasspaths) {
- super(jreClasspaths, new String[] {} /* ignore initial file names */, null);
+ private DefaultJavaRuntimeEnvironment(String[] jreClasspaths, String release) {
+ super(jreClasspaths, new String[] {} /* ignore initial file names */, null, release);
+ }
+ private DefaultJavaRuntimeEnvironment(Classpath[] jreClasspaths) {
+ super(jreClasspaths, new String[] {} /* ignore initial file names */, false);
}
private static INameEnvironment[] defaultJreClassLibs;
public static INameEnvironment[] create(String[] jreClasspaths) {
+ return create(jreClasspaths, null);
+ }
+ public static INameEnvironment[] create(String[] jreClasspaths, String release) {
+ if (defaultJreClassLibs == null) {
+ if (release != null && !release.equals("")) {
+ defaultJreClassLibs = new INameEnvironment[1];
+ Classpath[] classpath = new Classpath[jreClasspaths.length];
+ for(int i = 0; i < classpath.length; i++) {
+ if (jreClasspaths[i].endsWith(JRTUtil.JRT_FS_JAR)) {
+ File file = new File(jreClasspaths[0]);
+ classpath[i] = FileSystem.getOlderSystemRelease(file.getParentFile().getParent(), release, null);
+
+ } else {
+ classpath[i] = FileSystem.getClasspath(jreClasspaths[i], null, null);
+ }
+ }
+ defaultJreClassLibs[0] = new DefaultJavaRuntimeEnvironment(classpath);
+ }
+ }
if (defaultJreClassLibs == null) {
defaultJreClassLibs = new INameEnvironment[1];
- defaultJreClassLibs[0] = new DefaultJavaRuntimeEnvironment(jreClasspaths);
+ defaultJreClassLibs[0] = new DefaultJavaRuntimeEnvironment(jreClasspaths, release);
}
return defaultJreClassLibs;
}
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/DeprecatedTest.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/DeprecatedTest.java
index a14082e31..dc9e3bbd2 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/DeprecatedTest.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/DeprecatedTest.java
@@ -52,10 +52,10 @@ protected void tearDown() throws Exception {
}
@Override
-protected INameEnvironment getNameEnvironment(final String[] testFiles, String[] classPaths) {
+protected INameEnvironment getNameEnvironment(final String[] testFiles, String[] classPaths, Map<String, String> options) {
// constructs a name environment that is able to hide a type of name 'this.invisibleType':
this.classpaths = classPaths == null ? getDefaultClassPaths() : classPaths;
- return new InMemoryNameEnvironment(testFiles, getClassLibs(classPaths == null)) {
+ return new InMemoryNameEnvironment(testFiles, getClassLibs(classPaths == null, options)) {
@Override
public NameEnvironmentAnswer findType(char[][] compoundTypeName) {
if (DeprecatedTest.this.invisibleType != null && CharOperation.equals(DeprecatedTest.this.invisibleType, compoundTypeName))
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/EnumTest.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/EnumTest.java
index 4c8a6841b..fa6372d85 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/EnumTest.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/EnumTest.java
@@ -2467,6 +2467,25 @@ public void test078() {
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=85397
public void test079() throws Exception {
+ String op =
+ this.complianceLevel < ClassFileConstants.JDK17 ?
+ "----------\n" +
+ "1. ERROR in X.java (at line 3)\n" +
+ " private strictfp X() {}\n" +
+ " ^^^\n" +
+ "Illegal modifier for the constructor in type X; only public, protected & private are permitted\n" +
+ "----------\n" :
+ "----------\n" +
+ "1. WARNING in X.java (at line 3)\n" +
+ " private strictfp X() {}\n" +
+ " ^^^^^^^^\n" +
+ "Floating-point expressions are always strictly evaluated from source level 17. Keyword \'strictfp\' is not required.\n" +
+ "----------\n" +
+ "2. ERROR in X.java (at line 3)\n" +
+ " private strictfp X() {}\n" +
+ " ^^^\n" +
+ "Illegal modifier for the constructor in type X; only public, protected & private are permitted\n" +
+ "----------\n";
this.runNegativeTest(
new String[] {
"X.java",
@@ -2475,12 +2494,7 @@ public void test079() throws Exception {
" private strictfp X() {}\n" +
"}\n"
},
- "----------\n" +
- "1. ERROR in X.java (at line 3)\n" +
- " private strictfp X() {}\n" +
- " ^^^\n" +
- "Illegal modifier for the constructor in type X; only public, protected & private are permitted\n" +
- "----------\n"
+ op
);
this.runConformTest(
new String[] {
@@ -2493,10 +2507,17 @@ public void test079() throws Exception {
""
);
- String[] expectedOutputs = new String[] {
- " private strictfp X(java.lang.String arg0, int arg1);\n",
- " public static strictfp X[] values();\n",
- " public static strictfp X valueOf(java.lang.String arg0);\n"
+ String[] expectedOutputs =
+ this.complianceLevel < ClassFileConstants.JDK17 ?
+ new String[] {
+ " private strictfp X(java.lang.String arg0, int arg1);\n",
+ " public static strictfp X[] values();\n",
+ " public static strictfp X valueOf(java.lang.String arg0);\n"
+ } :
+ new String[] {
+ " private X(java.lang.String arg0, int arg1);\n",
+ " public static X[] values();\n",
+ " public static X valueOf(java.lang.String arg0);\n"
};
ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler();
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/GenericTypeTest.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/GenericTypeTest.java
index 17698127a..3154f1dbb 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/GenericTypeTest.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/GenericTypeTest.java
@@ -8,6 +8,10 @@
*
* SPDX-License-Identifier: EPL-2.0
*
+ * This is an implementation of an early-draft specification developed under the Java
+ * Community Process (JCP) and is made available for testing and evaluation purposes
+ * only. The code is not compatible with any specification of the JCP.
+ *
* Contributors:
* IBM Corporation - initial API and implementation
* Technical University Berlin - adapted for Object Teams
@@ -5410,7 +5414,7 @@ public class GenericTypeTest extends AbstractComparableTest {
customOptions);
}
public void test0178a() {
- if (this.complianceLevel < ClassFileConstants.JDK16)
+ if (this.complianceLevel < ClassFileConstants.JDK17)
return;
Map customOptions = getCompilerOptions();
customOptions.put(CompilerOptions.OPTION_EnablePreviews, CompilerOptions.ENABLED);
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/InstanceofPrimaryPatternTest.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/InstanceofPrimaryPatternTest.java
new file mode 100644
index 000000000..4b17c7d27
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/InstanceofPrimaryPatternTest.java
@@ -0,0 +1,275 @@
+/*******************************************************************************
+ * Copyright (c) 2021 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * This is an implementation of an early-draft specification developed under the Java
+ * Community Process (JCP) and is made available for testing and evaluation purposes
+ * only. The code is not compatible with any specification of the JCP.
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jdt.core.tests.compiler.regression;
+
+import java.util.Map;
+
+import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;
+import org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
+
+import junit.framework.Test;
+
+public class InstanceofPrimaryPatternTest extends AbstractRegressionTest {
+
+ private static final JavacTestOptions JAVAC_OPTIONS = new JavacTestOptions("-source 17 --enable-preview -Xlint:-preview");
+ static {
+// TESTS_NUMBERS = new int [] { 40 };
+// TESTS_RANGE = new int[] { 1, -1 };
+// TESTS_NAMES = new String[] { "test005" };
+ }
+
+ public static Class<?> testClass() {
+ return InstanceofPrimaryPatternTest.class;
+ }
+ public static Test suite() {
+ return buildMinimalComplianceTestSuite(testClass(), F_17);
+ }
+ public InstanceofPrimaryPatternTest(String testName){
+ super(testName);
+ }
+ // Enables the tests to run individually
+ protected Map<String, String> getCompilerOptions(boolean preview) {
+ Map<String, String> defaultOptions = super.getCompilerOptions();
+ if (this.complianceLevel >= ClassFileConstants.getLatestJDKLevel()
+ && preview) {
+ defaultOptions.put(CompilerOptions.OPTION_EnablePreviews, CompilerOptions.ENABLED);
+ }
+ return defaultOptions;
+ }
+
+ protected Map<String, String> getCompilerOptions() {
+ return getCompilerOptions(true);
+ }
+
+ @Override
+ protected void runConformTest(String[] testFiles, String expectedOutput, Map<String, String> customOptions) {
+ if(!isJRE17Plus)
+ return;
+ runConformTest(testFiles, expectedOutput, customOptions, new String[] {"--enable-preview"}, JAVAC_OPTIONS);
+ }
+ protected void runNegativeTest(
+ String[] testFiles,
+ String expectedCompilerLog,
+ String javacLog,
+ String[] classLibraries,
+ boolean shouldFlushOutputDirectory,
+ Map<String, String> customOptions) {
+ Runner runner = new Runner();
+ runner.testFiles = testFiles;
+ runner.expectedCompilerLog = expectedCompilerLog;
+ runner.javacTestOptions = JAVAC_OPTIONS;
+ runner.customOptions = customOptions;
+ runner.expectedJavacOutputString = javacLog;
+ runner.runNegativeTest();
+ }
+ public void test001() {
+ Map<String, String> options = getCompilerOptions(true);
+ runConformTest(
+ new String[] {
+ "X.java",
+ "public class X {\n" +
+ " public static void foo(Object obj) {\n" +
+ " if (obj instanceof String s) {\n" +
+ " System.out.println(s);\n" +
+ " }\n " +
+ " }\n" +
+ " public static void main(String[] obj) {\n" +
+ " foo(\"Hello World!\");\n" +
+ " }\n" +
+ "}\n",
+ },
+ "Hello World!",
+ options);
+ }
+ public void test002() {
+ Map<String, String> options = getCompilerOptions(true);
+ runConformTest(
+ new String[] {
+ "X.java",
+ "public class X {\n" +
+ " public static void foo(Object obj) {\n" +
+ " if (obj instanceof (String s)) {\n" +
+ " System.out.println(s);\n" +
+ " }\n " +
+ " }\n" +
+ " public static void main(String[] obj) {\n" +
+ " foo(\"Hello World!\");\n" +
+ " }\n" +
+ "}\n",
+ },
+ "Hello World!",
+ options);
+ }
+ public void test003() {
+ Map<String, String> options = getCompilerOptions(true);
+ runConformTest(
+ new String[] {
+ "X.java",
+ "public class X {\n" +
+ " public static void foo(Object obj) {\n" +
+ " if (obj instanceof ((String s))) {\n" +
+ " System.out.println(s);\n" +
+ " }\n " +
+ " }\n" +
+ " public static void main(String[] obj) {\n" +
+ " foo(\"Hello World!\");\n" +
+ " }\n" +
+ "}\n",
+ },
+ "Hello World!",
+ options);
+ }
+ public void test004() {
+ Map<String, String> options = getCompilerOptions(true);
+ runConformTest(
+ new String[] {
+ "X.java",
+ "public class X {\n" +
+ " public static void foo(Object obj) {\n" +
+ " if (obj instanceof ((((String s))))) {\n" +
+ " System.out.println(s);\n" +
+ " }\n " +
+ " }\n" +
+ " public static void main(String[] obj) {\n" +
+ " foo(\"Hello World!\");\n" +
+ " }\n" +
+ "}\n",
+ },
+ "Hello World!",
+ options);
+ }
+ public void test005() {
+ Map<String, String> options = getCompilerOptions(true);
+ runConformTest(
+ new String[] {
+ "X.java",
+ "public class X {\n" +
+ " public static void foo(Object obj) {\n" +
+ " if (obj instanceof (String s) && (s.length() > 0)) {\n" +
+ " System.out.println(s);\n" +
+ " }\n " +
+ " }\n" +
+ " public static void main(String[] obj) {\n" +
+ " foo(\"Hello World!\");\n" +
+ " }\n" +
+ "}\n",
+ },
+ "Hello World!",
+ options);
+ }
+ public void test006() {
+ runNegativeTest(
+ new String[] {
+ "X.java",
+ "public class X {\n" +
+ " public static void foo(Object obj) {\n" +
+ " if (obj instanceof (String s && s.length() > 0)) {\n" +
+ " System.out.println(s);\n" +
+ " }\n " +
+ " }\n" +
+ " public static void main(String[] obj) {\n" +
+ " foo(\"Hello World!\");\n" +
+ " Zork();\n" +
+ " }\n" +
+ "}\n",
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 9)\n" +
+ " Zork();\n" +
+ " ^^^^\n" +
+ "The method Zork() is undefined for the type X\n" +
+ "----------\n");
+ }
+ public void test007() {
+ runNegativeTest(
+ new String[] {
+ "X.java",
+ "public class X {\n" +
+ " public static void foo(Object obj) {\n" +
+ " if (obj instanceof var s) {\n" +
+ " System.out.println(s);\n" +
+ " }\n " +
+ " }\n" +
+ " public static void main(String[] obj) {\n" +
+ " foo(\"Hello World!\");\n" +
+ " Zork();\n" +
+ " }\n" +
+ "}\n",
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 3)\n" +
+ " if (obj instanceof var s) {\n" +
+ " ^^^\n" +
+ "\'var\' is not allowed here\n" +
+ "----------\n" +
+ "2. ERROR in X.java (at line 9)\n" +
+ " Zork();\n" +
+ " ^^^^\n" +
+ "The method Zork() is undefined for the type X\n" +
+ "----------\n");
+ }
+ public void test008() {
+ runNegativeTest(
+ new String[] {
+ "X.java",
+ "public class X {\n" +
+ " public static void foo(Object obj) {\n" +
+ " if (obj instanceof (((var s)))) {\n" +
+ " System.out.println(s);\n" +
+ " }\n " +
+ " }\n" +
+ " public static void main(String[] obj) {\n" +
+ " foo(\"Hello World!\");\n" +
+ " Zork();\n" +
+ " }\n" +
+ "}\n",
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 3)\n" +
+ " if (obj instanceof (((var s)))) {\n" +
+ " ^^^\n" +
+ "\'var\' is not allowed here\n" +
+ "----------\n" +
+ "2. ERROR in X.java (at line 9)\n" +
+ " Zork();\n" +
+ " ^^^^\n" +
+ "The method Zork() is undefined for the type X\n" +
+ "----------\n");
+ }
+ public void test009() {
+ runNegativeTest(
+ new String[] {
+ "X.java",
+ "public class X {\n" +
+ " public static void foo(String s) {\n" +
+ " if (s instanceof Object o) {\n" +
+ " System.out.println(s);\n" +
+ " }\n " +
+ " }\n" +
+ " public static void main(String[] obj) {\n" +
+ " foo(\"Hello World!\");\n" +
+ " }\n" +
+ "}\n",
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 3)\n" +
+ " if (s instanceof Object o) {\n" +
+ " ^^^^^^^^^^^^^^^^^^^^^\n" +
+ "Expression type cannot be a subtype of the Pattern type\n" +
+ "----------\n");
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/InterfaceMethodsTest.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/InterfaceMethodsTest.java
index d74edfb10..3912c46c1 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/InterfaceMethodsTest.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/InterfaceMethodsTest.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2013, 2019 GK Software AG, IBM Corporation and others.
+ * Copyright (c) 2013, 2021 GK Software AG, IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -81,6 +81,54 @@ public class InterfaceMethodsTest extends AbstractComparableTest {
// default methods with various modifiers, negative cases
public void testModifiers1a() {
String infMod = this.complianceLevel >= ClassFileConstants.JDK9 ? " private," : "";
+ String op = this.complianceLevel < ClassFileConstants.JDK17 ?
+ "----------\n" +
+ "1. ERROR in I.java (at line 5)\n" +
+ " public default synchronized void foo2() { System.exit(0); }\n" +
+ " ^^^^^^\n" +
+ "Illegal modifier for the interface method foo2; only public,"+ infMod +" abstract, default, static and strictfp are permitted\n" +
+ "----------\n" +
+ "2. ERROR in I.java (at line 7)\n" +
+ " public default strictfp synchronized void foo4() {}\n" +
+ " ^^^^^^\n" +
+ "Illegal modifier for the interface method foo4; only public,"+ infMod +" abstract, default, static and strictfp are permitted\n" +
+ "----------\n" +
+ "3. ERROR in I.java (at line 8)\n" +
+ " public default strictfp synchronized @Annot void foo5() {}\n" +
+ " ^^^^^^\n" +
+ "Illegal modifier for the interface method foo5; only public,"+ infMod +" abstract, default, static and strictfp are permitted\n" +
+ "----------\n" :
+ "----------\n" +
+ "1. ERROR in I.java (at line 5)\n" +
+ " public default synchronized void foo2() { System.exit(0); }\n" +
+ " ^^^^^^\n" +
+ "Illegal modifier for the interface method foo2; only public, private, abstract, default, static and strictfp are permitted\n" +
+ "----------\n" +
+ "2. WARNING in I.java (at line 6)\n" +
+ " strictfp default void foo3() {}\n" +
+ " ^^^^^^^^\n" +
+ "Floating-point expressions are always strictly evaluated from source level 17. Keyword \'strictfp\' is not required.\n" +
+ "----------\n" +
+ "3. WARNING in I.java (at line 7)\n" +
+ " public default strictfp synchronized void foo4() {}\n" +
+ " ^^^^^^^^\n" +
+ "Floating-point expressions are always strictly evaluated from source level 17. Keyword \'strictfp\' is not required.\n" +
+ "----------\n" +
+ "4. ERROR in I.java (at line 7)\n" +
+ " public default strictfp synchronized void foo4() {}\n" +
+ " ^^^^^^\n" +
+ "Illegal modifier for the interface method foo4; only public, private, abstract, default, static and strictfp are permitted\n" +
+ "----------\n" +
+ "5. WARNING in I.java (at line 8)\n" +
+ " public default strictfp synchronized @Annot void foo5() {}\n" +
+ " ^^^^^^^^\n" +
+ "Floating-point expressions are always strictly evaluated from source level 17. Keyword \'strictfp\' is not required.\n" +
+ "----------\n" +
+ "6. ERROR in I.java (at line 8)\n" +
+ " public default strictfp synchronized @Annot void foo5() {}\n" +
+ " ^^^^^^\n" +
+ "Illegal modifier for the interface method foo5; only public, private, abstract, default, static and strictfp are permitted\n" +
+ "----------\n";
runNegativeTest(
new String[] {
"I.java",
@@ -93,22 +141,7 @@ public class InterfaceMethodsTest extends AbstractComparableTest {
" public default strictfp synchronized void foo4() {}\n" +
" public default strictfp synchronized @Annot void foo5() {}\n" +
"}\n"},
- "----------\n" +
- "1. ERROR in I.java (at line 5)\n" +
- " public default synchronized void foo2() { System.exit(0); }\n" +
- " ^^^^^^\n" +
- "Illegal modifier for the interface method foo2; only public,"+ infMod +" abstract, default, static and strictfp are permitted\n" +
- "----------\n" +
- "2. ERROR in I.java (at line 7)\n" +
- " public default strictfp synchronized void foo4() {}\n" +
- " ^^^^^^\n" +
- "Illegal modifier for the interface method foo4; only public,"+ infMod +" abstract, default, static and strictfp are permitted\n" +
- "----------\n" +
- "3. ERROR in I.java (at line 8)\n" +
- " public default strictfp synchronized @Annot void foo5() {}\n" +
- " ^^^^^^\n" +
- "Illegal modifier for the interface method foo5; only public,"+ infMod +" abstract, default, static and strictfp are permitted\n" +
- "----------\n");
+ op);
}
// default methods with various modifiers, simple syntax error blows the parser
@@ -148,7 +181,19 @@ public class InterfaceMethodsTest extends AbstractComparableTest {
" ^^^^^^^\n" +
"Syntax error, insert \"MethodSpecsLong EmptyParameterMappings\" to complete InvalidCallinBinding\n" +
// SH}
- "----------\n");
+ "----------\n" +
+ (this.complianceLevel >= ClassFileConstants.JDK17 ?
+ "4. WARNING in I.java (at line 7)\n" +
+ " default public strictfp void foo4() {}\n" +
+ " ^^^^^^^^\n" +
+ "Floating-point expressions are always strictly evaluated from source level 17. Keyword \'strictfp\' is not required.\n" +
+ "----------\n" +
+ "5. WARNING in I.java (at line 8)\n" +
+ " public strictfp default @Annot void foo5() {}\n" +
+ " ^^^^^^^^\n" +
+ "Floating-point expressions are always strictly evaluated from source level 17. Keyword \'strictfp\' is not required.\n" +
+ "----------\n" : "")
+ );
}
// regular interface with illegal modifiers
@@ -2147,6 +2192,13 @@ public class InterfaceMethodsTest extends AbstractComparableTest {
// test for different error messages in modifiers.
public void test400977() {
String infMod = this.complianceLevel >= ClassFileConstants.JDK9 ? " private," : "";
+ String extra = this.complianceLevel >= ClassFileConstants.JDK17 ?
+ "----------\n" +
+ "2. WARNING in I.java (at line 3)\n" +
+ " public abstract default strictfp final void bar();}\n" +
+ " ^^^^^^^^\n" +
+ "Floating-point expressions are always strictly evaluated from source level 17. Keyword \'strictfp\' is not required.\n" : "";
+ int offset = this.complianceLevel >= ClassFileConstants.JDK17 ? 1 : 0;
runNegativeTest(
new String[] {
"I.java",
@@ -2159,18 +2211,19 @@ public class InterfaceMethodsTest extends AbstractComparableTest {
" default abstract void foo();\n" +
" ^^^^^\n" +
"Illegal combination of modifiers for the interface method foo; only one of abstract, default, or static permitted\n" +
+ extra +
"----------\n" +
- "2. ERROR in I.java (at line 3)\n" +
+ (2 + offset) + ". ERROR in I.java (at line 3)\n" +
" public abstract default strictfp final void bar();}\n" +
" ^^^^^\n" +
"strictfp is not permitted for abstract interface method bar\n" +
"----------\n" +
- "3. ERROR in I.java (at line 3)\n" +
+ (3 + offset) + ". ERROR in I.java (at line 3)\n" +
" public abstract default strictfp final void bar();}\n" +
" ^^^^^\n" +
"Illegal combination of modifiers for the interface method bar; only one of abstract, default, or static permitted\n" +
"----------\n" +
- "4. ERROR in I.java (at line 3)\n" +
+ (3 + offset) + ". ERROR in I.java (at line 3)\n" +
" public abstract default strictfp final void bar();}\n" +
" ^^^^^\n" +
"Illegal modifier for the interface method bar; only public,"+ infMod +" abstract, default, static and strictfp are permitted\n" +
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/JavadocTest_1_5.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/JavadocTest_1_5.java
index 3bdd55dc2..e4ca9e60c 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/JavadocTest_1_5.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/JavadocTest_1_5.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2000, 2014 IBM Corporation and others.
+ * Copyright (c) 2000, 2021 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -1746,7 +1746,7 @@ public class JavadocTest_1_5 extends JavadocTest {
* Bug 86769: [javadoc] Warn/Error for 'Missing javadoc comments' doesn't recognize private inner classes
* @see "http://bugs.eclipse.org/bugs/show_bug.cgi?id=86769"
*/
- public void testBug86769() {
+ public void _testBug86769() {
this.reportMissingJavadocComments = CompilerOptions.ERROR;
runNegativeTest(
new String[] {
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/LocalStaticsTest.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/LocalStaticsTest.java
index 24dcdf617..4241dae1f 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/LocalStaticsTest.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/LocalStaticsTest.java
@@ -7,6 +7,10 @@
*
* SPDX-License-Identifier: EPL-2.0
*
+ * This is an implementation of an early-draft specification developed under the Java
+ * Community Process (JCP) and is made available for testing and evaluation purposes
+ * only. The code is not compatible with any specification of the JCP.
+ *
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
@@ -65,12 +69,11 @@ public class LocalStaticsTest extends AbstractRegressionTest {
runner.expectedOutputString = expectedOutput;
runner.vmArguments = new String[] {"--enable-preview"};
runner.customOptions = customOptions;
- runner.javacTestOptions = JavacTestOptions.forReleaseWithPreview("16");
runner.runConformTest();
}
@Override
protected void runNegativeTest(String[] testFiles, String expectedCompilerLog) {
- runNegativeTest(testFiles, expectedCompilerLog, JavacTestOptions.forReleaseWithPreview("15"));
+ runNegativeTest(testFiles, expectedCompilerLog, null);
}
protected void runWarningTest(String[] testFiles, String expectedCompilerLog) {
runWarningTest(testFiles, expectedCompilerLog, null);
@@ -85,9 +88,6 @@ public class LocalStaticsTest extends AbstractRegressionTest {
runner.testFiles = testFiles;
runner.expectedCompilerLog = expectedCompilerLog;
runner.customOptions = customOptions;
- runner.vmArguments = new String[] {"--enable-preview"};
- runner.javacTestOptions = javacAdditionalTestOptions == null ? JavacTestOptions.forReleaseWithPreview("15") :
- JavacTestOptions.forReleaseWithPreview("16", javacAdditionalTestOptions);
runner.runWarningTest();
}
@@ -988,6 +988,7 @@ public class LocalStaticsTest extends AbstractRegressionTest {
"----------\n"
);
}
+
public void testBug568514LocalEnums_004() {
this.runNegativeTest(
new String[] {
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/ModuleCompilationTests.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/ModuleCompilationTests.java
index b66db7417..e3f06ee44 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/ModuleCompilationTests.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/ModuleCompilationTests.java
@@ -8,6 +8,10 @@
*
* SPDX-License-Identifier: EPL-2.0
*
+ * This is an implementation of an early-draft specification developed under the Java
+ * Community Process (JCP) and is made available for testing and evaluation purposes
+ * only. The code is not compatible with any specification of the JCP.
+ *
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
@@ -846,7 +850,7 @@ public class ModuleCompilationTests extends AbstractBatchCompilerTest {
"p/X.java",
"package p;\n" +
"public class X {\n" +
- " java.lang.SecurityManager man = null;\n" +
+ " java.lang.SecurityException ex = null;\n" +
"}",
"module-info.java",
"module mod.one { \n" +
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/NegativeLambdaExpressionsTest.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/NegativeLambdaExpressionsTest.java
index ed6c2c755..8dc580b3b 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/NegativeLambdaExpressionsTest.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/NegativeLambdaExpressionsTest.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2011, 2019 IBM Corporation and others.
+ * Copyright (c) 2011, 2021 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -473,6 +473,13 @@ public void test013() {
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=384595, Reject illegal modifiers on lambda arguments.
public void test014() {
+ String extra = this.complianceLevel < ClassFileConstants.JDK17 ? "" :
+ "----------\n" +
+ "2. WARNING in X.java (at line 5)\n" +
+ " I i = (final @Marker int x, @Undefined static strictfp public Object o, static volatile int p) -> x;\n" +
+ " ^^^^^^^^\n" +
+ "Floating-point expressions are always strictly evaluated from source level 17. Keyword \'strictfp\' is not required.\n";
+ int offset = this.complianceLevel < ClassFileConstants.JDK17 ? 0 : 1;
this.runNegativeTest(
new String[] {
"X.java",
@@ -490,23 +497,24 @@ public void test014() {
" I i = (final @Marker int x, @Undefined static strictfp public Object o, static volatile int p) -> x;\n" +
" ^^^^^^^^^\n" +
"Undefined cannot be resolved to a type\n" +
+ extra +
"----------\n" +
- "2. ERROR in X.java (at line 5)\n" +
+ (2 + offset) + ". ERROR in X.java (at line 5)\n" +
" I i = (final @Marker int x, @Undefined static strictfp public Object o, static volatile int p) -> x;\n" +
" ^^^^^^\n" +
"Lambda expression\'s parameter o is expected to be of type int\n" +
"----------\n" +
- "3. ERROR in X.java (at line 5)\n" +
+ (3 + offset) + ". ERROR in X.java (at line 5)\n" +
" I i = (final @Marker int x, @Undefined static strictfp public Object o, static volatile int p) -> x;\n" +
" ^\n" +
"Illegal modifier for parameter o; only final is permitted\n" +
"----------\n" +
- "4. ERROR in X.java (at line 5)\n" +
+ (4 + offset) + ". ERROR in X.java (at line 5)\n" +
" I i = (final @Marker int x, @Undefined static strictfp public Object o, static volatile int p) -> x;\n" +
" ^\n" +
"Illegal modifier for parameter p; only final is permitted\n" +
"----------\n" +
- "5. ERROR in X.java (at line 5)\n" +
+ (5 + offset) + ". ERROR in X.java (at line 5)\n" +
" I i = (final @Marker int x, @Undefined static strictfp public Object o, static volatile int p) -> x;\n" +
" ^\n" +
"Void methods cannot return a value\n" +
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/NullAnnotationTests17.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/NullAnnotationTests17.java
new file mode 100644
index 000000000..d37f557fa
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/NullAnnotationTests17.java
@@ -0,0 +1,499 @@
+/*******************************************************************************
+ * Copyright (c) 2021 GK Software SE, and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * This is an implementation of an early-draft specification developed under the Java
+ * Community Process (JCP) and is made available for testing and evaluation purposes
+ * only. The code is not compatible with any specification of the JCP.
+ *
+ * Contributors:
+ * Stephan Herrmann - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jdt.core.tests.compiler.regression;
+
+import static org.eclipse.jdt.core.tests.util.Util.createJar;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Map;
+
+import org.eclipse.jdt.core.tests.util.Util;
+import org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
+
+import junit.framework.Test;
+
+public class NullAnnotationTests17 extends AbstractNullAnnotationTest {
+
+ public NullAnnotationTests17(String name) {
+ super(name);
+ }
+
+ static {
+// TESTS_NAMES = new String[] { "test_totalTypePatternNonNullExpression" };
+// TESTS_NUMBERS = new int[] { 001 };
+// TESTS_RANGE = new int[] { 1, 12 };
+ }
+
+ public static Test suite() {
+ return buildMinimalComplianceTestSuite(testClass(), F_17);
+ }
+
+ public static Class<?> testClass() {
+ return NullAnnotationTests17.class;
+ }
+
+ @Deprecated // super method is deprecated
+ @Override
+ protected void setUpAnnotationLib() throws IOException {
+ if (this.LIBS == null) {
+ String[] defaultLibs = getDefaultClassPaths();
+ int len = defaultLibs.length;
+ this.LIBS = new String[len+1];
+ System.arraycopy(defaultLibs, 0, this.LIBS, 0, len);
+ this.LIBS[len] = createAnnotation_2_2_jar(Util.getOutputDirectory() + File.separator, null);
+ }
+ }
+
+ public static String createAnnotation_2_2_jar(String dirName, String jcl17Path) throws IOException {
+ // role our own annotation library as long as o.e.j.annotation is still at BREE 1.8:
+ String jarFileName = dirName + "org.eclipse.jdt.annotation_2.2.0.jar";
+ createJar(new String[] {
+ "module-info.java",
+ "module org.eclipse.jdt.annotation {\n" +
+ " exports org.eclipse.jdt.annotation;\n" +
+ "}\n",
+
+ "org/eclipse/jdt/annotation/DefaultLocation.java",
+ "package org.eclipse.jdt.annotation;\n" +
+ "\n" +
+ "public enum DefaultLocation {\n" +
+ " \n" +
+ " PARAMETER, RETURN_TYPE, FIELD, TYPE_PARAMETER, TYPE_BOUND, TYPE_ARGUMENT, ARRAY_CONTENTS\n" +
+ "}\n",
+
+ "org/eclipse/jdt/annotation/NonNullByDefault.java",
+ "package org.eclipse.jdt.annotation;\n" +
+ "\n" +
+ "import java.lang.annotation.ElementType;\n" +
+ "import static org.eclipse.jdt.annotation.DefaultLocation.*;\n" +
+ "\n" +
+ "import java.lang.annotation.*;\n" +
+ " \n" +
+ "@Documented\n" +
+ "@Retention(RetentionPolicy.CLASS)\n" +
+ "@Target({ ElementType.MODULE, ElementType.PACKAGE, ElementType.TYPE, ElementType.METHOD, ElementType.CONSTRUCTOR, ElementType.FIELD, ElementType.LOCAL_VARIABLE })\n" +
+ "public @interface NonNullByDefault {\n" +
+ " DefaultLocation[] value() default { PARAMETER, RETURN_TYPE, FIELD, TYPE_BOUND, TYPE_ARGUMENT };\n" +
+ "}",
+
+ "org/eclipse/jdt/annotation/NonNull.java",
+ "package org.eclipse.jdt.annotation;\n" +
+ "import static java.lang.annotation.ElementType.TYPE_USE;\n" +
+ "\n" +
+ "import java.lang.annotation.*;\n" +
+ " \n" +
+ "@Documented\n" +
+ "@Retention(RetentionPolicy.CLASS)\n" +
+ "@Target({ TYPE_USE })\n" +
+ "public @interface NonNull {\n" +
+ " // marker annotation with no members\n" +
+ "}\n",
+
+ "org/eclipse/jdt/annotation/Nullable.java",
+ "package org.eclipse.jdt.annotation;\n" +
+ "\n" +
+ "import static java.lang.annotation.ElementType.TYPE_USE;\n" +
+ "\n" +
+ "import java.lang.annotation.*;\n" +
+ " \n" +
+ "@Documented\n" +
+ "@Retention(RetentionPolicy.CLASS)\n" +
+ "@Target({ TYPE_USE })\n" +
+ "public @interface Nullable {\n" +
+ " // marker annotation with no members\n" +
+ "}\n"
+ },
+ null,
+ jarFileName,
+ jcl17Path != null ? new String[] { jcl17Path } : null,
+ "17");
+ return jarFileName;
+ }
+
+ // -------- helper ------------
+
+ private Runner getDefaultRunner() {
+ Runner runner = new Runner();
+ runner.classLibraries = this.LIBS;
+ Map<String,String> opts = getCompilerOptions();
+ opts.put(CompilerOptions.OPTION_Source, CompilerOptions.VERSION_17);
+ opts.put(CompilerOptions.OPTION_EnablePreviews, CompilerOptions.ENABLED);
+ opts.put(CompilerOptions.OPTION_ReportPreviewFeatures, CompilerOptions.IGNORE);
+ runner.customOptions = opts;
+ runner.vmArguments = new String[] {"--enable-preview"};
+ runner.javacTestOptions =
+ JavacTestOptions.Excuse.EclipseWarningConfiguredAsError;
+ return runner;
+ }
+
+ // --------- tests start -----------
+
+ public void test_typePatternIsNN() {
+ Runner runner = getDefaultRunner();
+ runner.testFiles = new String[] {
+ "X.java",
+ "import org.eclipse.jdt.annotation.*;\n" +
+ "public class X {\n" +
+ " void foo(Object o) {\n" +
+ " switch (o) {\n" +
+ " case Integer i -> consumeInt(i);\n" +
+ " default -> System.out.println(\"default\");\n" +
+ " }\n" +
+ " }\n" +
+ " void consumeInt(@NonNull Integer i) {\n" +
+ " System.out.print(i);\n" +
+ " }\n" +
+ " public static void main(String... args) {\n" +
+ " new X().foo(3);\n" +
+ " }\n" +
+ "}\n"
+ };
+ runner.expectedCompilerLog = "";
+ runner.expectedOutputString = "3";
+ runner.runConformTest();
+ }
+
+ public void test_totalTypePatternAdmitsNull() {
+ Runner runner = getDefaultRunner();
+ runner.testFiles = new String[] {
+ "X.java",
+ "import org.eclipse.jdt.annotation.*;\n" +
+ "public class X {\n" +
+ " void foo(Number n) {\n" +
+ " try {\n" +
+ " switch (n) {\n" +
+ " case Integer i -> consumeInt(i);\n" +
+ " case Number n0 -> consumeNumber(n0);\n" +
+ " }\n" +
+ " } catch (NullPointerException npe) {\n" +
+ " // ignoring the unchecked warning, and expecting the NPE:\n" +
+ " System.out.print(npe.getMessage());\n" +
+ " }\n" +
+ " }\n" +
+ " void consumeInt(@NonNull Integer i) {\n" +
+ " System.out.print(i);\n" +
+ " }\n" +
+ " void consumeNumber(@NonNull Number n) {\n" +
+ " System.out.print(n.toString());\n" +
+ " }\n" +
+ " public static void main(String... args) {\n" +
+ " new X().foo(null);\n" +
+ " }\n" +
+ "}\n"
+ };
+ runner.expectedCompilerLog =
+ "----------\n" +
+ "1. WARNING in X.java (at line 7)\n" +
+ " case Number n0 -> consumeNumber(n0);\n" +
+ " ^^\n" +
+ "Null type safety (type annotations): The expression of type \'Number\' needs unchecked conversion to conform to \'@NonNull Number\'\n" +
+ "----------\n";
+ runner.expectedOutputString = "Cannot invoke \"Object.toString()\" because \"n\" is null";
+ runner.runConformTest();
+ }
+
+ public void test_totalTypePatternNonNullExpression() {
+ Runner runner = getDefaultRunner();
+ runner.testFiles = new String[] {
+ "X.java",
+ "import org.eclipse.jdt.annotation.*;\n" +
+ "public class X {\n" +
+ " void foo(Number n) {\n" +
+ " if (n == null) return;\n" + // this prevents the NPE -> no need to warn
+ " switch (n) {\n" +
+ " case Integer i -> System.out.print(i);\n" +
+ " case Number n0 -> consumeNumber(n0);\n" +
+ " }\n" +
+ " }\n" +
+ " void consumeNumber(@NonNull Number n) {\n" +
+ " System.out.print(n.toString());\n" +
+ " }\n" +
+ " public static void main(String... args) {\n" +
+ " new X().foo(null);\n" +
+ " }\n" +
+ "}\n"
+ };
+ runner.expectedCompilerLog = "";
+ runner.expectedOutputString = "";
+ runner.runConformTest();
+ }
+
+ public void test_totalTypePatternNonNullExpression_swExpr() {
+ Runner runner = getDefaultRunner();
+ runner.testFiles = new String[] {
+ "X.java",
+ "import org.eclipse.jdt.annotation.*;\n" +
+ "public class X {\n" +
+ " int foo(Number n) {\n" +
+ " if (n == null) return -1;\n" + // this prevents the NPE -> no need to warn
+ " return switch (n) {\n" +
+ " case Integer i -> i;\n" +
+ " case Number n0 -> consumeNumber(n0);\n" +
+ " };\n" +
+ " }\n" +
+ " int consumeNumber(@NonNull Number n) {\n" +
+ " return Integer.valueOf(n.toString());\n" +
+ " }\n" +
+ " public static void main(String... args) {\n" +
+ " new X().foo(null);\n" +
+ " }\n" +
+ "}\n"
+ };
+ runner.expectedCompilerLog = "";
+ runner.expectedOutputString = "";
+ runner.runConformTest();
+ }
+
+ public void test_totalTypePatternPlusNullPattern() {
+ Runner runner = getDefaultRunner();
+ runner.testFiles = new String[] {
+ "X.java",
+ "import org.eclipse.jdt.annotation.*;\n" +
+ "public class X {\n" +
+ " void foo(Number n) {\n" +
+ " switch (n) {\n" +
+ " case null -> System.out.print(\"null\");\n" + // this prevents the NPE
+ " case Integer i -> System.out.print(i);\n" +
+ " case Number n0 -> consumeNumber(n0);\n" +
+ " }\n" +
+ " }\n" +
+ " void consumeNumber(@NonNull Number n) {\n" +
+ " System.out.print(n.toString());\n" +
+ " }\n" +
+ " public static void main(String... args) {\n" +
+ " new X().foo(null);\n" +
+ " }\n" +
+ "}\n"
+ };
+ runner.expectedCompilerLog = "";
+ runner.expectedOutputString = "null";
+ runner.runConformTest();
+ }
+
+ public void test_totalTypePatternNullableExpression() {
+ Runner runner = getDefaultRunner();
+ runner.testFiles = new String[] {
+ "X.java",
+ "import org.eclipse.jdt.annotation.*;\n" +
+ "public class X {\n" +
+ " void foo(@Nullable Number n) {\n" + // @Nullable here turns "unchecked" into "null type mismatch"
+ " switch (n) {\n" +
+ " case Integer i -> System.out.print(i);\n" +
+ " case Number n0 -> consumeNumber(n0);\n" +
+ " }\n" +
+ " }\n" +
+ " void consumeNumber(@NonNull Number n) {\n" +
+ " System.out.print(n.toString());\n" +
+ " }\n" +
+ " public static void main(String... args) {\n" +
+ " new X().foo(null);\n" +
+ " }\n" +
+ "}\n"
+ };
+ runner.expectedCompilerLog =
+ "----------\n" +
+ "1. ERROR in X.java (at line 6)\n" +
+ " case Number n0 -> consumeNumber(n0);\n" +
+ " ^^\n" +
+ "Null type mismatch: required \'@NonNull Number\' but the provided value is inferred as @Nullable\n" +
+ "----------\n";
+ runner.runNegativeTest();
+ }
+
+ public void test_switchOverNNValueWithNullCase() {
+ Runner runner = getDefaultRunner();
+ runner.customOptions.put(CompilerOptions.OPTION_ReportRedundantNullCheck, CompilerOptions.WARNING);
+ runner.testFiles = new String[] {
+ "X.java",
+ "import org.eclipse.jdt.annotation.*;\n" +
+ "public class X {\n" +
+ " void foo(@NonNull Object o) {\n" +
+ " switch (o) {\n" +
+ " case Integer i -> consumeInt(i);\n" +
+ " case null -> System.out.print(\"null\");\n" +
+ " default -> System.out.println(\"default\");\n" +
+ " }\n" +
+ " }\n" +
+ " void consumeInt(@NonNull Integer i) {\n" +
+ " System.out.print(i);\n" +
+ " }\n" +
+ " public static void main(String... args) {\n" +
+ " new X().foo(3);\n" +
+ " }\n" +
+ "}\n"
+ };
+ runner.expectedCompilerLog =
+ "----------\n" +
+ "1. WARNING in X.java (at line 6)\n" +
+ " case null -> System.out.print(\"null\");\n" +
+ " ^^^^^^^^^\n" +
+ "Unnecessary \'null\' pattern, the switch selector expression cannot be null\n" +
+ "----------\n";
+ runner.expectedOutputString = "3";
+ runner.runConformTest();
+ }
+
+ public void test_switchNullInSameCase() {
+ Runner runner = getDefaultRunner();
+ runner.customOptions.put(CompilerOptions.OPTION_ReportRedundantNullCheck, CompilerOptions.WARNING);
+ runner.testFiles = new String[] {
+ "X.java",
+ "import org.eclipse.jdt.annotation.*;\n" +
+ "public class X {\n" +
+ " void foo(Object o) {\n" +
+ " switch (o) {\n" +
+ " case null, Integer i -> consumeInt(i);\n" +
+ " default -> System.out.println(\"default\");\n" +
+ " }\n" +
+ " }\n" +
+ " void consumeInt(@NonNull Integer i) {\n" +
+ " System.out.print(i);\n" +
+ " }\n" +
+ " public static void main(String... args) {\n" +
+ " new X().foo(3);\n" +
+ " }\n" +
+ "}\n"
+ };
+ // demonstrate that null case cannot leak into a type pattern:
+ runner.expectedCompilerLog =
+ "----------\n" +
+ "1. ERROR in X.java (at line 5)\n" +
+ " case null, Integer i -> consumeInt(i);\n" +
+ " ^^^^^^^^^\n" +
+ "Illegal fall-through to a pattern\n" +
+ "----------\n";
+ runner.runNegativeTest();
+ }
+
+ public void test_switchOverNNValueWithNullCase_swExpr() {
+ Runner runner = getDefaultRunner();
+ runner.customOptions.put(CompilerOptions.OPTION_ReportRedundantNullCheck, CompilerOptions.WARNING);
+ runner.testFiles = new String[] {
+ "X.java",
+ "import org.eclipse.jdt.annotation.*;\n" +
+ "public class X {\n" +
+ " int foo(@NonNull Object o) {\n" +
+ " return switch (o) {\n" +
+ " case Integer i -> consumeInt(i);\n" +
+ " case null -> 0;\n" +
+ " default -> -1;\n" +
+ " };\n" +
+ " }\n" +
+ " int consumeInt(@NonNull Integer i) {\n" +
+ " return i;\n" +
+ " }\n" +
+ " public static void main(String... args) {\n" +
+ " System.out.print(new X().foo(3));\n" +
+ " }\n" +
+ "}\n"
+ };
+ runner.expectedCompilerLog =
+ "----------\n" +
+ "1. WARNING in X.java (at line 6)\n" +
+ " case null -> 0;\n" +
+ " ^^^^^^^^^\n" +
+ "Unnecessary \'null\' pattern, the switch selector expression cannot be null\n" +
+ "----------\n";
+ runner.expectedOutputString = "3";
+ runner.runConformTest();
+ }
+
+ public void test_nullHostileSwitch() {
+ Runner runner = getDefaultRunner();
+ runner.customOptions.put(CompilerOptions.OPTION_ReportRedundantNullCheck, CompilerOptions.WARNING);
+ runner.testFiles = new String[] {
+ "X.java",
+ "import org.eclipse.jdt.annotation.*;\n" +
+ "public class X {\n" +
+ " void foo(@Nullable Object o) {\n" +
+ " switch (o) {\n" +
+ " case Integer i -> consumeInt(i);\n" +
+ " default -> System.out.println(o);\n" +
+ " };\n" +
+ " }\n" +
+ " void consumeInt(@NonNull Integer i) {\n" +
+ " }\n" +
+ " public static void main(String... args) {\n" +
+ " new X().foo(null);\n" +
+ " }\n" +
+ "}\n"
+ };
+ runner.expectedCompilerLog =
+ "----------\n" +
+ "1. ERROR in X.java (at line 4)\n" +
+ " switch (o) {\n" +
+ " ^\n" +
+ "Potential null pointer access: this expression has a \'@Nullable\' type\n" +
+ "----------\n";
+ runner.runNegativeTest();
+ }
+
+ public void test_defaultDoesNotApplyToNull() {
+ Runner runner = getDefaultRunner();
+ runner.customOptions.put(CompilerOptions.OPTION_ReportRedundantNullCheck, CompilerOptions.WARNING);
+ runner.testFiles = new String[] {
+ "X.java",
+ "import org.eclipse.jdt.annotation.*;\n" +
+ "public class X {\n" +
+ " void foo(@Nullable Object o) {\n" +
+ " switch (o) {\n" +
+ " case Integer i -> consumeInt(i);\n" +
+ " default -> System.out.println(o.toString());\n" +
+ " case null -> System.out.print(\"null\");\n" +
+ " };\n" +
+ " }\n" +
+ " void consumeInt(@NonNull Integer i) {\n" +
+ " }\n" +
+ " public static void main(String... args) {\n" +
+ " new X().foo(null);\n" +
+ " }\n" +
+ "}\n"
+ };
+ runner.expectedCompilerLog = "";
+ runner.expectedOutputString = "null";
+ runner.runConformTest();
+ }
+
+ public void test_defaultDoesNotApplyToNull_field() {
+ Runner runner = getDefaultRunner();
+ runner.customOptions.put(CompilerOptions.OPTION_SyntacticNullAnalysisForFields, CompilerOptions.ENABLED);
+ runner.testFiles = new String[] {
+ "X.java",
+ "import org.eclipse.jdt.annotation.*;\n" +
+ "public class X {\n" +
+ " @Nullable Object o;\n" +
+ " void foo() {\n" +
+ " switch (this.o) {\n" +
+ " case Integer i -> consumeInt(i);\n" +
+ " default -> System.out.println(this.o.toString());\n" +
+ " case null -> System.out.print(\"null\");\n" +
+ " };\n" +
+ " }\n" +
+ " void consumeInt(@NonNull Integer i) {\n" +
+ " }\n" +
+ " public static void main(String... args) {\n" +
+ " new X().foo();\n" +
+ " }\n" +
+ "}\n"
+ };
+ runner.expectedCompilerLog = "";
+ runner.expectedOutputString = "null";
+ runner.runConformTest();
+ }
+}
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/NullAnnotationTests9.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/NullAnnotationTests9.java
index f02810d47..34b05786b 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/NullAnnotationTests9.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/NullAnnotationTests9.java
@@ -144,9 +144,9 @@ public class NullAnnotationTests9 extends AbstractNullAnnotationTest {
Map<String,String> file2module = new HashMap<>();
@Override
- protected INameEnvironment getNameEnvironment(final String[] testFiles, String[] classPaths) {
+ protected INameEnvironment getNameEnvironment(final String[] testFiles, String[] classPaths, Map<String, String> options) {
this.classpaths = classPaths == null ? getDefaultClassPaths() : classPaths;
- INameEnvironment[] classLibs = getClassLibs(classPaths == null);
+ INameEnvironment[] classLibs = getClassLibs(classPaths == null, options);
for (INameEnvironment nameEnvironment : classLibs) {
((FileSystem) nameEnvironment).scanForModules(createParser());
}
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/PatternMatching16Test.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/PatternMatching16Test.java
index f853c26f9..2f13e97c3 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/PatternMatching16Test.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/PatternMatching16Test.java
@@ -7,6 +7,10 @@
*
* SPDX-License-Identifier: EPL-2.0
*
+ * This is an implementation of an early-draft specification developed under the Java
+ * Community Process (JCP) and is made available for testing and evaluation purposes
+ * only. The code is not compatible with any specification of the JCP.
+ *
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
@@ -15,6 +19,7 @@ package org.eclipse.jdt.core.tests.compiler.regression;
import java.io.IOException;
import java.util.Map;
+import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;
import org.eclipse.jdt.core.util.ClassFileBytesDisassembler;
import org.eclipse.jdt.core.util.ClassFormatException;
import org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
@@ -27,7 +32,7 @@ public class PatternMatching16Test extends AbstractRegressionTest {
static {
// TESTS_NUMBERS = new int [] { 40 };
// TESTS_RANGE = new int[] { 1, -1 };
-// TESTS_NAMES = new String[] { "test063b" };
+// TESTS_NAMES = new String[] { "testBug575035" };
}
public static Class<?> testClass() {
@@ -42,18 +47,16 @@ public class PatternMatching16Test extends AbstractRegressionTest {
// Enables the tests to run individually
protected Map<String, String> getCompilerOptions(boolean preview) {
Map<String, String> defaultOptions = super.getCompilerOptions();
- defaultOptions.put(CompilerOptions.OPTION_Compliance, CompilerOptions.VERSION_16);
- defaultOptions.put(CompilerOptions.OPTION_Source, CompilerOptions.VERSION_16);
- defaultOptions.put(CompilerOptions.OPTION_TargetPlatform, CompilerOptions.VERSION_16);
- defaultOptions.put(CompilerOptions.OPTION_EnablePreviews,
- preview ? CompilerOptions.ENABLED : CompilerOptions.DISABLED);
- defaultOptions.put(CompilerOptions.OPTION_ReportPreviewFeatures, CompilerOptions.WARNING);
+ if (this.complianceLevel >= ClassFileConstants.getLatestJDKLevel()
+ && preview) {
+ defaultOptions.put(CompilerOptions.OPTION_EnablePreviews, CompilerOptions.ENABLED);
+ }
return defaultOptions;
}
@Override
protected void runConformTest(String[] testFiles, String expectedOutput, Map<String, String> customOptions) {
- if(!isJRE15Plus)
+ if(!isJRE16Plus)
return;
runConformTest(testFiles, expectedOutput, customOptions, new String[] {"--enable-preview"}, JAVAC_OPTIONS);
}
@@ -91,7 +94,7 @@ public class PatternMatching16Test extends AbstractRegressionTest {
"1. ERROR in X1.java (at line 3)\n" +
" if (obj instanceof String s) {\n" +
" ^^^^^^^^\n" +
- "The Java feature 'Pattern Matching in instanceof Expressions' is only available with source level "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +" and above\n" +
+ "The Java feature 'Pattern Matching in instanceof Expressions' is only available with source level 16 and above\n" +
"----------\n",
null,
true,
@@ -101,6 +104,8 @@ public class PatternMatching16Test extends AbstractRegressionTest {
options.put(CompilerOptions.OPTION_TargetPlatform, CompilerOptions.VERSION_16);
}
public void test000b() {
+ if (this.complianceLevel < ClassFileConstants.getLatestJDKLevel())
+ return;
Map<String, String> options = getCompilerOptions(true);
options.put(CompilerOptions.OPTION_Compliance, CompilerOptions.VERSION_14);
options.put(CompilerOptions.OPTION_Source, CompilerOptions.VERSION_14);
@@ -119,7 +124,7 @@ public class PatternMatching16Test extends AbstractRegressionTest {
"1. ERROR in X1.java (at line 0)\n" +
" public class X1 {\n" +
" ^\n" +
- "Preview features enabled at an invalid source release level 14, preview can be enabled only at source level "+AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL+"\n" +
+ "Preview features enabled at an invalid source release level 14, preview can be enabled only at source level 17\n" +
"----------\n",
null,
true,
@@ -3861,6 +3866,31 @@ public class PatternMatching16Test extends AbstractRegressionTest {
options);
}
+ public void testBug573880() {
+ if (this.complianceLevel < ClassFileConstants.JDK17)
+ return;
+ Map<String, String> compilerOptions = getCompilerOptions(true);
+ runNegativeTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"
+ + " public void foo(Object o) {\n"
+ + " if (o instanceof var s) {\n"
+ + " System.out.println(s);\n"
+ + " }\n"
+ + " }\n"
+ + "}",
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 3)\n" +
+ " if (o instanceof var s) {\n" +
+ " ^^^\n" +
+ "\'var\' is not allowed here\n" +
+ "----------\n",
+ null,
+ true,
+ compilerOptions);
+ }
public void testBug574906() {
Map<String, String> options = getCompilerOptions(false);
runConformTest(
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/PreviewFeatureTest.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/PreviewFeatureTest.java
index 546ce0f69..f564280fb 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/PreviewFeatureTest.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/PreviewFeatureTest.java
@@ -7,6 +7,10 @@
*
* SPDX-License-Identifier: EPL-2.0
*
+ * This is an implementation of an early-draft specification developed under the Java
+ * Community Process (JCP) and is made available for testing and evaluation purposes
+ * only. The code is not compatible with any specification of the JCP.
+ *
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
@@ -14,7 +18,9 @@ package org.eclipse.jdt.core.tests.compiler.regression;
import java.util.Map;
+import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;
import org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
+import org.eclipse.jdt.internal.compiler.impl.JavaFeature;
import junit.framework.Test;
@@ -35,23 +41,21 @@ public class PreviewFeatureTest extends AbstractRegressionTest9 {
public PreviewFeatureTest(String testName){
super(testName);
}
-
- // Enables the tests to run individually
+ @Override
protected Map<String, String> getCompilerOptions() {
- Map<String, String> defaultOptions = super.getCompilerOptions();
- defaultOptions.put(CompilerOptions.OPTION_Compliance, CompilerOptions.VERSION_16);
- defaultOptions.put(CompilerOptions.OPTION_Source, CompilerOptions.VERSION_16);
- defaultOptions.put(CompilerOptions.OPTION_TargetPlatform, CompilerOptions.VERSION_16);
- defaultOptions.put(CompilerOptions.OPTION_EnablePreviews, CompilerOptions.ENABLED);
- defaultOptions.put(CompilerOptions.OPTION_ReportPreviewFeatures, CompilerOptions.IGNORE);
- defaultOptions.put(CompilerOptions.OPTION_Store_Annotations, CompilerOptions.ENABLED);
- return defaultOptions;
+ Map<String, String> options = super.getCompilerOptions();
+ if (isJRE17Plus) {
+ options.put(CompilerOptions.OPTION_Release, CompilerOptions.ENABLED);
+ }
+ return options;
}
-
/*
* Preview API, --enable-preview=false, SuppressWarning=No
*/
public void test001() {
+ if (this.complianceLevel >= ClassFileConstants.JDK17) {
+ return;
+ }
Map<String, String> options = getCompilerOptions();
String old = options.get(CompilerOptions.OPTION_EnablePreviews);
options.put(CompilerOptions.OPTION_EnablePreviews, CompilerOptions.DISABLED);
@@ -97,6 +101,9 @@ public class PreviewFeatureTest extends AbstractRegressionTest9 {
* Preview API, --enable-preview=false, SuppressWarning=yes
*/
public void test002() {
+ if (this.complianceLevel >= ClassFileConstants.JDK17) {
+ return;
+ }
Map<String, String> options = getCompilerOptions();
String old = options.get(CompilerOptions.OPTION_EnablePreviews);
options.put(CompilerOptions.OPTION_EnablePreviews, CompilerOptions.DISABLED);
@@ -133,6 +140,8 @@ public class PreviewFeatureTest extends AbstractRegressionTest9 {
* Preview API, --enable-preview=true, SuppressWarning=No
*/
public void test003() {
+ if (this.complianceLevel < ClassFileConstants.getLatestJDKLevel())
+ return;
Map<String, String> options = getCompilerOptions();
String old = options.get(CompilerOptions.OPTION_EnablePreviews);
options.put(CompilerOptions.OPTION_EnablePreviews, CompilerOptions.ENABLED);
@@ -168,6 +177,8 @@ public class PreviewFeatureTest extends AbstractRegressionTest9 {
* Preview API, --enable-preview=true, SuppressWarning=Yes
*/
public void test004() {
+ if (this.complianceLevel < ClassFileConstants.getLatestJDKLevel())
+ return;
Map<String, String> options = getCompilerOptions();
String old = options.get(CompilerOptions.OPTION_EnablePreviews);
options.put(CompilerOptions.OPTION_EnablePreviews, CompilerOptions.ENABLED);
@@ -200,4 +211,20 @@ public class PreviewFeatureTest extends AbstractRegressionTest9 {
options.put(CompilerOptions.OPTION_EnablePreviews, old);
}
}
+ public void test005() {
+ if (this.complianceLevel < ClassFileConstants.JDK16)
+ return;
+ Map<String, String> options = getCompilerOptions();
+ String old = options.get(CompilerOptions.OPTION_EnablePreviews);
+ if (this.complianceLevel == ClassFileConstants.getLatestJDKLevel())
+ options.put(CompilerOptions.OPTION_EnablePreviews, CompilerOptions.ENABLED);
+ try {
+ if (this.complianceLevel < ClassFileConstants.getLatestJDKLevel())
+ assertFalse(JavaFeature.PATTERN_MATCHING_IN_SWITCH.isSupported(new CompilerOptions(options)));
+ else
+ assertTrue(JavaFeature.PATTERN_MATCHING_IN_SWITCH.isSupported(new CompilerOptions(options)));
+ } finally {
+ options.put(CompilerOptions.OPTION_EnablePreviews, old);
+ }
+ }
}
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/RecordsRestrictedClassTest.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/RecordsRestrictedClassTest.java
index 798c52c7b..9cdfc1179 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/RecordsRestrictedClassTest.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/RecordsRestrictedClassTest.java
@@ -7,6 +7,10 @@
*
* SPDX-License-Identifier: EPL-2.0
*
+ * This is an implementation of an early-draft specification developed under the Java
+ * Community Process (JCP) and is made available for testing and evaluation purposes
+ * only. The code is not compatible with any specification of the JCP.
+ *
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
@@ -20,6 +24,7 @@ import org.eclipse.jdt.core.ToolFactory;
import org.eclipse.jdt.core.tests.util.Util;
import org.eclipse.jdt.core.util.ClassFileBytesDisassembler;
import org.eclipse.jdt.core.util.ClassFormatException;
+import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;
import org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
import junit.framework.Test;
@@ -48,11 +53,21 @@ public class RecordsRestrictedClassTest extends AbstractRegressionTest {
defaultOptions.put(CompilerOptions.OPTION_Compliance, CompilerOptions.VERSION_16);
defaultOptions.put(CompilerOptions.OPTION_Source, CompilerOptions.VERSION_16);
defaultOptions.put(CompilerOptions.OPTION_TargetPlatform, CompilerOptions.VERSION_16);
- defaultOptions.put(CompilerOptions.OPTION_EnablePreviews, CompilerOptions.ENABLED);
defaultOptions.put(CompilerOptions.OPTION_ReportPreviewFeatures, CompilerOptions.IGNORE);
defaultOptions.put(CompilerOptions.OPTION_Store_Annotations, CompilerOptions.ENABLED);
return defaultOptions;
}
+ // Enables the tests to run individually
+ protected Map<String, String> getCompilerOptionsWithPreview() {
+ Map<String, String> defaultOptions = super.getCompilerOptions();
+ defaultOptions.put(CompilerOptions.OPTION_Compliance, CompilerOptions.VERSION_17);
+ defaultOptions.put(CompilerOptions.OPTION_Source, CompilerOptions.VERSION_17);
+ defaultOptions.put(CompilerOptions.OPTION_TargetPlatform, CompilerOptions.VERSION_17);
+ defaultOptions.put(CompilerOptions.OPTION_ReportPreviewFeatures, CompilerOptions.IGNORE);
+ defaultOptions.put(CompilerOptions.OPTION_Store_Annotations, CompilerOptions.ENABLED);
+ defaultOptions.put(CompilerOptions.OPTION_EnablePreviews, CompilerOptions.ENABLED);
+ return defaultOptions;
+ }
@Override
protected void runConformTest(String[] testFiles, String expectedOutput) {
@@ -68,7 +83,7 @@ public class RecordsRestrictedClassTest extends AbstractRegressionTest {
runner.expectedOutputString = expectedOutput;
runner.vmArguments = new String[] {"--enable-preview"};
runner.customOptions = customOptions;
- runner.javacTestOptions = JavacTestOptions.forReleaseWithPreview("16");
+ runner.javacTestOptions = JavacTestOptions.forRelease("16");
runner.runConformTest();
}
@Override
@@ -91,9 +106,9 @@ public class RecordsRestrictedClassTest extends AbstractRegressionTest {
runner.testFiles = testFiles;
runner.expectedCompilerLog = expectedCompilerLog;
runner.customOptions = customOptions;
- runner.vmArguments = new String[] {"--enable-preview"};
- runner.javacTestOptions = javacAdditionalTestOptions == null ? JavacTestOptions.forReleaseWithPreview("16") :
- JavacTestOptions.forReleaseWithPreview("16", javacAdditionalTestOptions);
+ runner.vmArguments = new String[] {};
+ runner.javacTestOptions = javacAdditionalTestOptions == null ? JavacTestOptions.forRelease("16") :
+ JavacTestOptions.forRelease("16", javacAdditionalTestOptions);
runner.runWarningTest();
}
@@ -179,7 +194,7 @@ public class RecordsRestrictedClassTest extends AbstractRegressionTest {
runConformTest(
new String[] {
"X.java",
- "class X {\n"+
+ "public class X {\n"+
" public static void main(String[] args){\n"+
" System.out.println(0);\n" +
" }\n"+
@@ -769,7 +784,7 @@ public class RecordsRestrictedClassTest extends AbstractRegressionTest {
"1. ERROR in X.java (at line 1)\n" +
" class record {\n" +
" ^^^^^^\n" +
- "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
+ "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java 16\n" +
"----------\n");
}
public void testBug550750_033() {
@@ -786,7 +801,7 @@ public class RecordsRestrictedClassTest extends AbstractRegressionTest {
"1. ERROR in X.java (at line 1)\n" +
" class X<record> {\n" +
" ^^^^^^\n" +
- "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
+ "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java 16\n" +
"----------\n");
}
public void testBug550750_034() {
@@ -804,12 +819,12 @@ public class RecordsRestrictedClassTest extends AbstractRegressionTest {
"1. ERROR in X.java (at line 5)\n" +
" public <record> void foo(record args){}\n" +
" ^^^^^^\n" +
- "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
+ "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java 16\n" +
"----------\n" +
"2. ERROR in X.java (at line 5)\n" +
" public <record> void foo(record args){}\n" +
" ^^^^^^\n" +
- "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
+ "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java 16\n" +
"----------\n");
}
public void testBug550750_035() {
@@ -827,7 +842,7 @@ public class RecordsRestrictedClassTest extends AbstractRegressionTest {
"1. ERROR in X.java (at line 5)\n" +
" public void foo(record args){}\n" +
" ^^^^^^\n" +
- "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
+ "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java 16\n" +
"----------\n");
}
public void testBug550750_036() {
@@ -853,7 +868,7 @@ public class RecordsRestrictedClassTest extends AbstractRegressionTest {
"2. ERROR in X.java (at line 4)\n" +
" I lambda = (record r) -> {};\n" +
" ^^^^^^\n" +
- "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
+ "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java 16\n" +
"----------\n");
}
public void testBug550750_037() {
@@ -4720,12 +4735,12 @@ public void testBug564672_001() {
"1. ERROR in X.java (at line 1)\n" +
" class X extends record {\n" +
" ^^^^^^\n" +
- "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
+ "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java 16\n" +
"----------\n" +
"2. ERROR in X.java (at line 6)\n" +
" class record {}\n" +
" ^^^^^^\n" +
- "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
+ "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java 16\n" +
"----------\n");
}
public void testBug564672_002() {
@@ -4742,7 +4757,7 @@ public void testBug564672_002() {
"1. ERROR in X.java (at line 1)\n" +
" class X extends record {\n" +
" ^^^^^^\n" +
- "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
+ "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java 16\n" +
"----------\n");
}
public void testBug564672_003() {
@@ -4760,12 +4775,12 @@ public void testBug564672_003() {
"1. ERROR in X.java (at line 1)\n" +
" class X implements record {\n" +
" ^^^^^^\n" +
- "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
+ "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java 16\n" +
"----------\n" +
"2. ERROR in X.java (at line 5)\n" +
" interface record {}\n" +
" ^^^^^^\n" +
- "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
+ "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java 16\n" +
"----------\n");
}
public void testBug564672_004() {
@@ -4782,7 +4797,7 @@ public void testBug564672_004() {
"1. ERROR in X.java (at line 1)\n" +
" class X implements record {\n" +
" ^^^^^^\n" +
- "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
+ "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java 16\n" +
"----------\n");
}
public void testBug564672_005() {
@@ -4802,12 +4817,12 @@ public void testBug564672_005() {
"1. ERROR in X.java (at line 2)\n" +
" class Y extends record {\n" +
" ^^^^^^\n" +
- "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
+ "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java 16\n" +
"----------\n" +
"2. ERROR in X.java (at line 4)\n" +
" class record {}\n" +
" ^^^^^^\n" +
- "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
+ "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java 16\n" +
"----------\n");
}
public void testBug564672_006() {
@@ -4826,7 +4841,7 @@ public void testBug564672_006() {
"1. ERROR in X.java (at line 2)\n" +
" class Y extends record {\n" +
" ^^^^^^\n" +
- "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
+ "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java 16\n" +
"----------\n");
}
public void testBug564672_007() {
@@ -4846,12 +4861,12 @@ public void testBug564672_007() {
"1. ERROR in X.java (at line 2)\n" +
" class Y implements record {\n" +
" ^^^^^^\n" +
- "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
+ "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java 16\n" +
"----------\n" +
"2. ERROR in X.java (at line 4)\n" +
" interface record {}\n" +
" ^^^^^^\n" +
- "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
+ "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java 16\n" +
"----------\n");
}
public void testBug564672_008() {
@@ -4870,7 +4885,7 @@ public void testBug564672_008() {
"1. ERROR in X.java (at line 2)\n" +
" class Y implements record {\n" +
" ^^^^^^\n" +
- "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
+ "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java 16\n" +
"----------\n");
}
public void testBug564672_009() {
@@ -4890,12 +4905,12 @@ public void testBug564672_009() {
"1. ERROR in X.java (at line 1)\n" +
" interface Y extends record {\n" +
" ^^^^^^\n" +
- "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
+ "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java 16\n" +
"----------\n" +
"2. ERROR in X.java (at line 3)\n" +
" interface record {}\n" +
" ^^^^^^\n" +
- "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
+ "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java 16\n" +
"----------\n");
}
public void testBug564672_010() {
@@ -4914,7 +4929,7 @@ public void testBug564672_010() {
"1. ERROR in X.java (at line 1)\n" +
" interface Y extends record {\n" +
" ^^^^^^\n" +
- "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
+ "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java 16\n" +
"----------\n");
}
public void testBug564672_011() {
@@ -4934,12 +4949,12 @@ public void testBug564672_011() {
"1. ERROR in X.java (at line 2)\n" +
" interface Y extends record {\n" +
" ^^^^^^\n" +
- "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
+ "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java 16\n" +
"----------\n" +
"2. ERROR in X.java (at line 4)\n" +
" interface record {}\n" +
" ^^^^^^\n" +
- "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
+ "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java 16\n" +
"----------\n");
}
public void testBug564672_012() {
@@ -4958,7 +4973,7 @@ public void testBug564672_012() {
"1. ERROR in X.java (at line 2)\n" +
" interface Y extends record {\n" +
" ^^^^^^\n" +
- "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
+ "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java 16\n" +
"----------\n");
}
public void testBug564672_013() {
@@ -4975,12 +4990,12 @@ public void testBug564672_013() {
"1. ERROR in X.java (at line 2)\n" +
" class Y extends record {\n" +
" ^^^^^^\n" +
- "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
+ "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java 16\n" +
"----------\n" +
"2. ERROR in X.java (at line 4)\n" +
" class record {}\n" +
" ^^^^^^\n" +
- "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
+ "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java 16\n" +
"----------\n");
}
public void testBug564672_014() {
@@ -4996,7 +5011,7 @@ public void testBug564672_014() {
"1. ERROR in X.java (at line 2)\n" +
" class Y extends record {\n" +
" ^^^^^^\n" +
- "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
+ "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java 16\n" +
"----------\n");
}
public void testBug564672_015() {
@@ -5013,12 +5028,12 @@ public void testBug564672_015() {
"1. ERROR in X.java (at line 2)\n" +
" class Y implements record {\n" +
" ^^^^^^\n" +
- "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
+ "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java 16\n" +
"----------\n" +
"2. ERROR in X.java (at line 4)\n" +
" interface record {}\n" +
" ^^^^^^\n" +
- "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
+ "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java 16\n" +
"----------\n");
}
public void testBug564672_016() {
@@ -5034,7 +5049,7 @@ public void testBug564672_016() {
"1. ERROR in X.java (at line 2)\n" +
" class Y implements record {\n" +
" ^^^^^^\n" +
- "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
+ "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java 16\n" +
"----------\n");
}
public void testBug564672_017() {
@@ -5051,12 +5066,12 @@ public void testBug564672_017() {
"1. ERROR in X.java (at line 2)\n" +
" interface Y extends record {\n" +
" ^^^^^^\n" +
- "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
+ "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java 16\n" +
"----------\n" +
"2. ERROR in X.java (at line 4)\n" +
" interface record {}\n" +
" ^^^^^^\n" +
- "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
+ "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java 16\n" +
"----------\n");
}
public void testBug564672_018() {
@@ -5072,7 +5087,7 @@ public void testBug564672_018() {
"1. ERROR in X.java (at line 2)\n" +
" interface Y extends record {\n" +
" ^^^^^^\n" +
- "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
+ "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java 16\n" +
"----------\n");
}
public void testBug564672_019() {
@@ -5093,12 +5108,12 @@ public void testBug564672_019() {
"1. ERROR in X.java (at line 3)\n" +
" record r=new record(i,j);\n" +
" ^^^^^^\n" +
- "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
+ "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java 16\n" +
"----------\n" +
"2. ERROR in X.java (at line 3)\n" +
" record r=new record(i,j);\n" +
" ^^^^^^\n" +
- "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
+ "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java 16\n" +
"----------\n" +
"3. ERROR in X.java (at line 4)\n" +
" return r;\n" +
@@ -5125,17 +5140,17 @@ public void testBug564672_020() {
"1. ERROR in X.java (at line 2)\n" +
" class record {};\n" +
" ^^^^^^\n" +
- "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
+ "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java 16\n" +
"----------\n" +
"2. ERROR in X.java (at line 4)\n" +
" record r=new record();\n" +
" ^^^^^^\n" +
- "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
+ "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java 16\n" +
"----------\n" +
"3. ERROR in X.java (at line 4)\n" +
" record r=new record();\n" +
" ^^^^^^\n" +
- "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
+ "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java 16\n" +
"----------\n" +
"4. ERROR in X.java (at line 5)\n" +
" return r;\n" +
@@ -5254,7 +5269,7 @@ public void testBug564672_023() {
"1. ERROR in X.java (at line 5)\n" +
" static IPoint a(int i, int j) throws record{\n" +
" ^^^^^^\n" +
- "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
+ "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java 16\n" +
"----------\n");
}
public void testBug564672_024() {
@@ -5272,7 +5287,7 @@ public void testBug564672_024() {
"1. ERROR in X.java (at line 2)\n" +
" X() throws record {} \n" +
" ^^^^^^\n" +
- "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
+ "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java 16\n" +
"----------\n");
}
public void testBug564672_025() {
@@ -5287,7 +5302,7 @@ public void testBug564672_025() {
"1. ERROR in X.java (at line 2)\n" +
" int a() throws record; \n" +
" ^^^^^^\n" +
- "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
+ "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java 16\n" +
"----------\n");
}
public void testBug564672_026() {
@@ -5306,7 +5321,7 @@ public void testBug564672_026() {
"1. ERROR in X.java (at line 2)\n" +
" List<record> R = new List<record>();\n" +
" ^^^^^^\n" +
- "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
+ "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java 16\n" +
"----------\n" +
"2. ERROR in X.java (at line 2)\n" +
" List<record> R = new List<record>();\n" +
@@ -5316,7 +5331,7 @@ public void testBug564672_026() {
"3. ERROR in X.java (at line 2)\n" +
" List<record> R = new List<record>();\n" +
" ^^^^^^\n" +
- "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
+ "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java 16\n" +
"----------\n");
}
public void testBug564672_027() {
@@ -5344,12 +5359,12 @@ public void testBug564672_027() {
"2. ERROR in X.java (at line 4)\n" +
" public class X implements I<record>{\n" +
" ^^^^^^\n" +
- "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
+ "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java 16\n" +
"----------\n" +
"3. ERROR in X.java (at line 5)\n" +
" void print(record arg){\n" +
" ^^^^^^\n" +
- "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
+ "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java 16\n" +
"----------\n");
}
public void testBug564672_028() {
@@ -5369,12 +5384,12 @@ public void testBug564672_028() {
"1. ERROR in X.java (at line 1)\n" +
" class Y<record> {\n" +
" ^^^^^^\n" +
- "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
+ "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java 16\n" +
"----------\n" +
"2. ERROR in X.java (at line 2)\n" +
" void equal(record R) {}\n" +
" ^^^^^^\n" +
- "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
+ "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java 16\n" +
"----------\n");
}
public void testBug564672_029() {
@@ -5394,12 +5409,12 @@ public void testBug564672_029() {
"1. ERROR in X.java (at line 1)\n" +
" class Y<record> {\n" +
" ^^^^^^\n" +
- "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
+ "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java 16\n" +
"----------\n" +
"2. ERROR in X.java (at line 2)\n" +
" Y(record R) {}\n" +
" ^^^^^^\n" +
- "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
+ "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java 16\n" +
"----------\n");
}
public void testBug564672_030() {
@@ -5417,7 +5432,7 @@ public void testBug564672_030() {
"1. ERROR in X.java (at line 2)\n" +
" static record i= 0;\n" +
" ^^^^^^\n" +
- "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
+ "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java 16\n" +
"----------\n");
}
public void testBug564672_031() {
@@ -5437,7 +5452,7 @@ public void testBug564672_031() {
"1. ERROR in X.java (at line 2)\n" +
" record i=0;\n" +
" ^^^^^^\n" +
- "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
+ "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java 16\n" +
"----------\n");
}
public void testBug564672_032() {
@@ -5457,7 +5472,7 @@ public void testBug564672_032() {
"1. ERROR in X.java (at line 2)\n" +
" static int sum(record i, int param){\n" +
" ^^^^^^\n" +
- "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
+ "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java 16\n" +
"----------\n");
}
public void testBug564672_033() {
@@ -5476,7 +5491,7 @@ public void testBug564672_033() {
"1. ERROR in X.java (at line 2)\n" +
" X(record i, int param){\n" +
" ^^^^^^\n" +
- "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
+ "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java 16\n" +
"----------\n");
}
public void testBug564672_034() {
@@ -5496,7 +5511,7 @@ public void testBug564672_034() {
"1. ERROR in X.java (at line 2)\n" +
" int sum(record i, int num);\n" +
" ^^^^^^\n" +
- "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
+ "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java 16\n" +
"----------\n");
}
public void testBug564672_035() {
@@ -5535,7 +5550,7 @@ public void testBug564672_036() {
"1. ERROR in X.java (at line 2)\n" +
" int sum(record this, int i, int num) {}\n" +
" ^^^^^^\n" +
- "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
+ "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java 16\n" +
"----------\n");
}
public void testBug564672_037() {
@@ -5553,7 +5568,7 @@ public void testBug564672_037() {
"1. ERROR in X.java (at line 2)\n" +
" static record i;\n" +
" ^^^^^^\n" +
- "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
+ "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java 16\n" +
"----------\n");
}
public void testBug564672_038() {
@@ -5572,7 +5587,7 @@ public void testBug564672_038() {
"1. ERROR in X.java (at line 3)\n" +
" for (record i = 0; i<10; i++) {\n" +
" ^^^^^^\n" +
- "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
+ "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java 16\n" +
"----------\n");
}
public void testBug564672_039() {
@@ -5592,7 +5607,7 @@ public void testBug564672_039() {
"1. ERROR in X.java (at line 4)\n" +
" for (record i: rec) {\n" +
" ^^^^^^\n" +
- "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
+ "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java 16\n" +
"----------\n" +
"2. ERROR in X.java (at line 4)\n" +
" for (record i: rec) {\n" +
@@ -5616,7 +5631,7 @@ public void testBug564672_040() {
"1. ERROR in X.java (at line 3)\n" +
" try (record i = 0){\n" +
" ^^^^^^\n" +
- "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
+ "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java 16\n" +
"----------\n");
}
public void testBug564672_041() {
@@ -5636,7 +5651,7 @@ public void testBug564672_041() {
"1. ERROR in X.java (at line 5)\n" +
" catch (record e) {}\n" +
" ^^^^^^\n" +
- "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
+ "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java 16\n" +
"----------\n");
}
public void testBug564672_042() {
@@ -5659,7 +5674,7 @@ public void testBug564672_042() {
"2. ERROR in X.java (at line 1)\n" +
" record Point(record x, int i) { }\n" +
" ^^^^^^\n" +
- "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
+ "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java 16\n" +
"----------\n");
}
public void testBug564672_043() {
@@ -5683,7 +5698,7 @@ public void testBug564672_043() {
"1. ERROR in X.java (at line 5)\n" +
" <record> this(null);\n" +
" ^^^^^^\n" +
- "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
+ "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java 16\n" +
"----------\n" +
"2. ERROR in X.java (at line 5)\n" +
" <record> this(null);\n" +
@@ -5714,7 +5729,7 @@ public void testBug564672_044() {
"1. ERROR in X.java (at line 7)\n" +
" <record> super(null);\n" +
" ^^^^^^\n" +
- "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
+ "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java 16\n" +
"----------\n" +
"2. ERROR in X.java (at line 7)\n" +
" <record> super(null);\n" +
@@ -5742,7 +5757,7 @@ public void testBug564672_045() {
"1. ERROR in X.java (at line 4)\n" +
" this.<record>m1(); }\n" +
" ^^^^^^\n" +
- "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
+ "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java 16\n" +
"----------\n" +
"2. WARNING in X.java (at line 4)\n" +
" this.<record>m1(); }\n" +
@@ -5770,7 +5785,7 @@ public void testBug564672_046() {
"1. ERROR in X.java (at line 8)\n" +
" new <record>Y().a();\n" +
" ^^^^^^\n" +
- "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
+ "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java 16\n" +
"----------\n" +
"2. WARNING in X.java (at line 8)\n" +
" new <record>Y().a();\n" +
@@ -5799,7 +5814,7 @@ public void testBug564672_047() {
"1. ERROR in X.java (at line 5)\n" +
" new <record>Y() {\n" +
" ^^^^^^\n" +
- "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
+ "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java 16\n" +
"----------\n" +
"2. WARNING in X.java (at line 5)\n" +
" new <record>Y() {\n" +
@@ -5828,7 +5843,7 @@ public void testBug564672_048() {
"1. ERROR in X.java (at line 5)\n" +
" new <record>Y() {\n" +
" ^^^^^^\n" +
- "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
+ "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java 16\n" +
"----------\n" +
"2. WARNING in X.java (at line 5)\n" +
" new <record>Y() {\n" +
@@ -5851,12 +5866,12 @@ public void testBug564672_049() {
"1. ERROR in X.java (at line 3)\n" +
" record[] y= new record[3]; \n" +
" ^^^^^^^^\n" +
- "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
+ "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java 16\n" +
"----------\n" +
"2. ERROR in X.java (at line 3)\n" +
" record[] y= new record[3]; \n" +
" ^^^^^^\n" +
- "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
+ "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java 16\n" +
"----------\n");
}
public void testBug564672_050() {
@@ -5875,12 +5890,12 @@ public void testBug564672_050() {
"1. ERROR in X.java (at line 4)\n" +
" record y= (record)s; \n" +
" ^^^^^^\n" +
- "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
+ "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java 16\n" +
"----------\n" +
"2. ERROR in X.java (at line 4)\n" +
" record y= (record)s; \n" +
" ^^^^^^\n" +
- "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
+ "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java 16\n" +
"----------\n");
}
public void testBug564672_051() {
@@ -5901,7 +5916,7 @@ public void testBug564672_051() {
"1. ERROR in X.java (at line 4)\n" +
" if (s instanceof record) { \n" +
" ^^^^^^\n" +
- "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
+ "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java 16\n" +
"----------\n");
}
public void testBug564672_052() {
@@ -5950,7 +5965,7 @@ public void testBug564672_053() {
"2. ERROR in X.java (at line 7)\n" +
" messages.stream().map(record::new).toArray(record[]::new);\n" +
" ^^^^^^^^\n" +
- "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
+ "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java 16\n" +
"----------\n");
}
@SuppressWarnings({ "rawtypes", "unchecked" })
@@ -5991,7 +6006,7 @@ public void testBug564672b_002() {
"1. ERROR in X.java (at line 1)\n" +
" class X extends record {\n" +
" ^^^^^^\n" +
- "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
+ "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java 16\n" +
"----------\n",
null,
true,
@@ -6036,7 +6051,7 @@ public void testBug564672b_004() {
"1. ERROR in X.java (at line 1)\n" +
" class X implements record {\n" +
" ^^^^^^\n" +
- "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
+ "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java 16\n" +
"----------\n",
null,
true,
@@ -6085,7 +6100,7 @@ public void testBug564672b_006() {
"1. ERROR in X.java (at line 2)\n" +
" class Y extends record {\n" +
" ^^^^^^\n" +
- "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
+ "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java 16\n" +
"----------\n",
null,
true,
@@ -6134,7 +6149,7 @@ public void testBug564672b_008() {
"1. ERROR in X.java (at line 2)\n" +
" class Y implements record {\n" +
" ^^^^^^\n" +
- "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
+ "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java 16\n" +
"----------\n",
null,
true,
@@ -6183,7 +6198,7 @@ public void testBug564672b_010() {
"1. ERROR in X.java (at line 1)\n" +
" interface Y extends record {\n" +
" ^^^^^^\n" +
- "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
+ "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java 16\n" +
"----------\n",
null,
true,
@@ -6232,7 +6247,7 @@ public void testBug564672b_012() {
"1. ERROR in X.java (at line 2)\n" +
" interface Y extends record {\n" +
" ^^^^^^\n" +
- "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
+ "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java 16\n" +
"----------\n",
null,
true,
@@ -6280,7 +6295,7 @@ public void testBug564672b_014() {
"1. ERROR in X.java (at line 2)\n" +
" class Y extends record {\n" +
" ^^^^^^\n" +
- "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
+ "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java 16\n" +
"----------\n",
null,
true,
@@ -6328,7 +6343,7 @@ public void testBug564672b_016() {
"1. ERROR in X.java (at line 2)\n" +
" class Y implements record {\n" +
" ^^^^^^\n" +
- "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
+ "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java 16\n" +
"----------\n",
null,
true,
@@ -6376,7 +6391,7 @@ public void testBug564672b_018() {
"1. ERROR in X.java (at line 2)\n" +
" interface Y extends record {\n" +
" ^^^^^^\n" +
- "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
+ "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java 16\n" +
"----------\n",
null,
true,
@@ -6961,7 +6976,7 @@ public void testBug564672b_039() {
"2. ERROR in X.java (at line 7)\n" +
" class record {}\n" +
" ^^^^^^\n" +
- "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
+ "\'record\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java 16\n" +
"----------\n",
null,
true,
@@ -7264,8 +7279,8 @@ public void testBug564672b_049() {
);
}
public void testBug565388_001() {
- Map<String, String> options = getCompilerOptions();
- options.put(CompilerOptions.OPTION_EnablePreviews, CompilerOptions.ENABLED);
+ if (this.complianceLevel < ClassFileConstants.JDK17) return;
+ Map<String, String> options = getCompilerOptionsWithPreview();
this.runNegativeTest(
new String[] {
"X.java",
@@ -7284,8 +7299,8 @@ public void testBug565388_001() {
options.put(CompilerOptions.OPTION_EnablePreviews, CompilerOptions.DISABLED);
}
public void testBug565388_002() {
- Map<String, String> options = getCompilerOptions();
- options.put(CompilerOptions.OPTION_EnablePreviews, CompilerOptions.ENABLED);
+ if (this.complianceLevel < ClassFileConstants.JDK17) return;
+ Map<String, String> options = getCompilerOptionsWithPreview();
this.runNegativeTest(
new String[] {
"X.java",
@@ -7746,8 +7761,8 @@ public void testBug563182_07() {
"private final int X$1Bar.x");
}
public void testBug566063_001() {
- Map<String, String> options = getCompilerOptions();
- options.put(CompilerOptions.OPTION_EnablePreviews, CompilerOptions.ENABLED);
+ if (this.complianceLevel < ClassFileConstants.JDK17) return;
+ Map<String, String> options = getCompilerOptionsWithPreview();
runConformTest(
new String[] {
"X.java",
@@ -7773,8 +7788,8 @@ public void testBug566063_001() {
options.put(CompilerOptions.OPTION_EnablePreviews, CompilerOptions.DISABLED);
}
public void testBug566063_002() {
- Map<String, String> options = getCompilerOptions();
- options.put(CompilerOptions.OPTION_EnablePreviews, CompilerOptions.ENABLED);
+ if (this.complianceLevel < ClassFileConstants.JDK17) return;
+ Map<String, String> options = getCompilerOptionsWithPreview();
runNegativeTest(
new String[] {
"X.java",
@@ -7807,8 +7822,8 @@ public void testBug566063_002() {
options.put(CompilerOptions.OPTION_EnablePreviews, CompilerOptions.DISABLED);
}
public void testBug566063_003() {
- Map<String, String> options = getCompilerOptions();
- options.put(CompilerOptions.OPTION_EnablePreviews, CompilerOptions.ENABLED);
+ if (this.complianceLevel < ClassFileConstants.JDK17) return;
+ Map<String, String> options = getCompilerOptionsWithPreview();
runNegativeTest(
new String[] {
"X.java",
@@ -8029,8 +8044,8 @@ public void testBug566554_04() {
"----------\n");
}
public void testBug567731_001() {
- Map<String, String> options = getCompilerOptions();
- options.put(CompilerOptions.OPTION_EnablePreviews, CompilerOptions.ENABLED);
+ if (this.complianceLevel < ClassFileConstants.JDK17) return;
+ Map<String, String> options = getCompilerOptionsWithPreview();
this.runNegativeTest(
new String[] {
"X.java",
@@ -8059,8 +8074,8 @@ public void testBug567731_001() {
options.put(CompilerOptions.OPTION_EnablePreviews, CompilerOptions.DISABLED);
}
public void testBug567731_002() {
- Map<String, String> options = getCompilerOptions();
- options.put(CompilerOptions.OPTION_EnablePreviews, CompilerOptions.ENABLED);
+ if (this.complianceLevel < ClassFileConstants.JDK17) return;
+ Map<String, String> options = getCompilerOptionsWithPreview();
this.runNegativeTest(
new String[] {
"X.java",
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/SealedTypesTests.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/SealedTypesTests.java
index 31d8dea50..d6ce494b1 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/SealedTypesTests.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/SealedTypesTests.java
@@ -7,6 +7,10 @@
*
* SPDX-License-Identifier: EPL-2.0
*
+ * This is an implementation of an early-draft specification developed under the Java
+ * Community Process (JCP) and is made available for testing and evaluation purposes
+ * only. The code is not compatible with any specification of the JCP.
+ *
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
@@ -38,7 +42,7 @@ public class SealedTypesTests extends AbstractRegressionTest9 {
return SealedTypesTests.class;
}
public static Test suite() {
- return buildMinimalComplianceTestSuite(testClass(), F_16);
+ return buildMinimalComplianceTestSuite(testClass(), F_17);
}
public SealedTypesTests(String testName){
super(testName);
@@ -47,10 +51,9 @@ public class SealedTypesTests extends AbstractRegressionTest9 {
// Enables the tests to run individually
protected Map<String, String> getCompilerOptions() {
Map<String, String> defaultOptions = super.getCompilerOptions();
- defaultOptions.put(CompilerOptions.OPTION_Compliance, CompilerOptions.VERSION_16); // FIXME
- defaultOptions.put(CompilerOptions.OPTION_Source, CompilerOptions.VERSION_16);
- defaultOptions.put(CompilerOptions.OPTION_TargetPlatform, CompilerOptions.VERSION_16);
- defaultOptions.put(CompilerOptions.OPTION_EnablePreviews, CompilerOptions.ENABLED);
+ defaultOptions.put(CompilerOptions.OPTION_Compliance, CompilerOptions.VERSION_17);
+ defaultOptions.put(CompilerOptions.OPTION_Source, CompilerOptions.VERSION_17);
+ defaultOptions.put(CompilerOptions.OPTION_TargetPlatform, CompilerOptions.VERSION_17);
defaultOptions.put(CompilerOptions.OPTION_ReportPreviewFeatures, CompilerOptions.IGNORE);
defaultOptions.put(CompilerOptions.OPTION_Store_Annotations, CompilerOptions.ENABLED);
return defaultOptions;
@@ -68,12 +71,12 @@ public class SealedTypesTests extends AbstractRegressionTest9 {
runner.expectedOutputString = expectedOutput;
runner.vmArguments = new String[] {"--enable-preview"};
runner.customOptions = customOptions;
- runner.javacTestOptions = JavacTestOptions.forReleaseWithPreview("16");
+ runner.javacTestOptions = JavacTestOptions.forReleaseWithPreview("17");
runner.runConformTest();
}
@Override
protected void runNegativeTest(String[] testFiles, String expectedCompilerLog) {
- runNegativeTest(testFiles, expectedCompilerLog, JavacTestOptions.forReleaseWithPreview("16"));
+ runNegativeTest(testFiles, expectedCompilerLog, JavacTestOptions.forReleaseWithPreview("17"));
}
protected void runWarningTest(String[] testFiles, String expectedCompilerLog) {
runWarningTest(testFiles, expectedCompilerLog, null);
@@ -1378,7 +1381,7 @@ public class SealedTypesTests extends AbstractRegressionTest9 {
"public final class Z extends Y{}",
},
lib1Path,
- JavaCore.VERSION_16,
+ JavaCore.VERSION_17,
true);
String[] libs = getDefaultClassPaths();
int len = libs.length;
@@ -1686,7 +1689,7 @@ public class SealedTypesTests extends AbstractRegressionTest9 {
"}",
},
"----------\n" +
- "1. WARNING in X.java (at line 1)\n" +
+ "1. ERROR in X.java (at line 1)\n" +
" class permits {\n" +
" ^^^^^^^\n" +
"\'permits\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
@@ -1742,7 +1745,7 @@ public class SealedTypesTests extends AbstractRegressionTest9 {
},
"----------\n" +
"----------\n" +
- "1. WARNING in X.java (at line 2)\n" +
+ "1. ERROR in X.java (at line 2)\n" +
" permits p;\n" +
" ^^^^^^^\n" +
"\'permits\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
@@ -1753,7 +1756,7 @@ public class SealedTypesTests extends AbstractRegressionTest9 {
"The method Zork() is undefined for the type X\n" +
"----------\n" +
"----------\n" +
- "1. WARNING in permits.java (at line 1)\n" +
+ "1. ERROR in permits.java (at line 1)\n" +
" public class permits {\n" +
" ^^^^^^^\n" +
"\'permits\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
@@ -1809,7 +1812,7 @@ public class SealedTypesTests extends AbstractRegressionTest9 {
"}",
},
"----------\n" +
- "1. WARNING in X.java (at line 1)\n" +
+ "1. ERROR in X.java (at line 1)\n" +
" class X<permits> {\n" +
" ^^^^^^^\n" +
"\'permits\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
@@ -1891,7 +1894,7 @@ public class SealedTypesTests extends AbstractRegressionTest9 {
"}",
},
"----------\n" +
- "1. WARNING in X.java (at line 1)\n" +
+ "1. ERROR in X.java (at line 1)\n" +
" class X extends permits {\n" +
" ^^^^^^^\n" +
"\'permits\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
@@ -1901,7 +1904,7 @@ public class SealedTypesTests extends AbstractRegressionTest9 {
" ^^^^\n" +
"The method Zork() is undefined for the type X\n" +
"----------\n" +
- "3. WARNING in X.java (at line 6)\n" +
+ "3. ERROR in X.java (at line 6)\n" +
" class permits {\n" +
" ^^^^^^^\n" +
"\'permits\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
@@ -1956,7 +1959,7 @@ public class SealedTypesTests extends AbstractRegressionTest9 {
"}",
},
"----------\n" +
- "1. WARNING in X.java (at line 1)\n" +
+ "1. ERROR in X.java (at line 1)\n" +
" class X implements permits {\n" +
" ^^^^^^^\n" +
"\'permits\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
@@ -1966,7 +1969,7 @@ public class SealedTypesTests extends AbstractRegressionTest9 {
" ^^^^\n" +
"The method Zork() is undefined for the type X\n" +
"----------\n" +
- "3. WARNING in X.java (at line 6)\n" +
+ "3. ERROR in X.java (at line 6)\n" +
" interface permits {\n" +
" ^^^^^^^\n" +
"\'permits\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
@@ -2021,7 +2024,7 @@ public class SealedTypesTests extends AbstractRegressionTest9 {
"}",
},
"----------\n" +
- "1. WARNING in X.java (at line 1)\n" +
+ "1. ERROR in X.java (at line 1)\n" +
" interface X extends permits {\n" +
" ^^^^^^^\n" +
"\'permits\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
@@ -2031,7 +2034,7 @@ public class SealedTypesTests extends AbstractRegressionTest9 {
" ^^^^\n" +
"The method Zork() is undefined for the type X\n" +
"----------\n" +
- "3. WARNING in X.java (at line 6)\n" +
+ "3. ERROR in X.java (at line 6)\n" +
" interface permits {\n" +
" ^^^^^^^\n" +
"\'permits\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
@@ -2084,16 +2087,11 @@ public class SealedTypesTests extends AbstractRegressionTest9 {
"}",
},
"----------\n" +
- "1. WARNING in X.java (at line 2)\n" +
+ "1. ERROR in X.java (at line 2)\n" +
" permits foo() {\n" +
" ^^^^^^^\n" +
"\'permits\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
"----------\n" +
- "2. ERROR in X.java (at line 2)\n" +
- " permits foo() {\n" +
- " ^^^^^^^\n" +
- "permits cannot be resolved to a type\n" +
- "----------\n" +
"3. ERROR in X.java (at line 3)\n" +
" Zork();\n" +
" ^^^^\n" +
@@ -2140,16 +2138,11 @@ public class SealedTypesTests extends AbstractRegressionTest9 {
"}",
},
"----------\n" +
- "1. WARNING in X.java (at line 2)\n" +
+ "1. ERROR in X.java (at line 2)\n" +
" void foo() throws permits{\n" +
" ^^^^^^^\n" +
"\'permits\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
"----------\n" +
- "2. ERROR in X.java (at line 2)\n" +
- " void foo() throws permits{\n" +
- " ^^^^^^^\n" +
- "permits cannot be resolved to a type\n" +
- "----------\n" +
"3. ERROR in X.java (at line 3)\n" +
" Zork();\n" +
" ^^^^\n" +
@@ -2211,16 +2204,11 @@ public class SealedTypesTests extends AbstractRegressionTest9 {
"}",
},
"----------\n" +
- "1. WARNING in X.java (at line 1)\n" +
+ "1. ERROR in X.java (at line 1)\n" +
" class X <T extends permits>{\n" +
" ^^^^^^^\n" +
"\'permits\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
"----------\n" +
- "2. ERROR in X.java (at line 1)\n" +
- " class X <T extends permits>{\n" +
- " ^^^^^^^\n" +
- "permits cannot be resolved to a type\n" +
- "----------\n" +
"3. ERROR in X.java (at line 1)\n" +
" class X <T extends permits>{\n" +
" ^\n" +
@@ -2286,16 +2274,11 @@ public class SealedTypesTests extends AbstractRegressionTest9 {
"}",
},
"----------\n" +
- "1. WARNING in X.java (at line 3)\n" +
+ "1. ERROR in X.java (at line 3)\n" +
" private final permits p;\n" +
" ^^^^^^^\n" +
"\'permits\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
"----------\n" +
- "2. ERROR in X.java (at line 3)\n" +
- " private final permits p;\n" +
- " ^^^^^^^\n" +
- "permits cannot be resolved to a type\n" +
- "----------\n" +
"3. ERROR in X.java (at line 5)\n" +
" Zork();\n" +
" ^^^^\n" +
@@ -2355,16 +2338,11 @@ public class SealedTypesTests extends AbstractRegressionTest9 {
" ^^^^^^^^^^^^^\n" +
"This lambda expression refers to the missing type permits\n" +
"----------\n" +
- "2. WARNING in X.java (at line 3)\n" +
+ "2. ERROR in X.java (at line 3)\n" +
" I i = (permits p)-> {};\n" +
" ^^^^^^^\n" +
"\'permits\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
"----------\n" +
- "3. ERROR in X.java (at line 3)\n" +
- " I i = (permits p)-> {};\n" +
- " ^^^^^^^\n" +
- "permits cannot be resolved to a type\n" +
- "----------\n" +
"4. ERROR in X.java (at line 4)\n" +
" Zork();\n" +
" ^^^^\n" +
@@ -2402,15 +2380,10 @@ public class SealedTypesTests extends AbstractRegressionTest9 {
"}",
},
"----------\n" +
- "1. WARNING in X.java (at line 2)\n" +
+ "1. ERROR in X.java (at line 2)\n" +
" public void foo(permits this) {}\n" +
" ^^^^^^^\n" +
"\'permits\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
- "----------\n" +
- "2. ERROR in X.java (at line 2)\n" +
- " public void foo(permits this) {}\n" +
- " ^^^^^^^\n" +
- "permits cannot be resolved to a type\n" +
"----------\n",
null,
true,
@@ -2444,15 +2417,10 @@ public class SealedTypesTests extends AbstractRegressionTest9 {
"}",
},
"----------\n" +
- "1. WARNING in X.java (at line 2)\n" +
+ "1. ERROR in X.java (at line 2)\n" +
" public void foo(permits this) {}\n" +
" ^^^^^^^\n" +
"\'permits\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
- "----------\n" +
- "2. ERROR in X.java (at line 2)\n" +
- " public void foo(permits this) {}\n" +
- " ^^^^^^^\n" +
- "permits cannot be resolved to a type\n" +
"----------\n",
null,
true,
@@ -2495,12 +2463,12 @@ public class SealedTypesTests extends AbstractRegressionTest9 {
"}",
},
"----------\n" +
- "1. WARNING in X.java (at line 2)\n" +
+ "1. ERROR in X.java (at line 2)\n" +
" class permits {\n" +
" ^^^^^^^\n" +
"\'permits\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
"----------\n" +
- "2. WARNING in X.java (at line 3)\n" +
+ "2. ERROR in X.java (at line 3)\n" +
" public void foo(permits this) {}\n" +
" ^^^^^^^\n" +
"\'permits\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
@@ -2548,16 +2516,11 @@ public class SealedTypesTests extends AbstractRegressionTest9 {
"}",
},
"----------\n" +
- "1. WARNING in X.java (at line 3)\n" +
+ "1. ERROR in X.java (at line 3)\n" +
" permits p;\n" +
" ^^^^^^^\n" +
"\'permits\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
"----------\n" +
- "2. ERROR in X.java (at line 3)\n" +
- " permits p;\n" +
- " ^^^^^^^\n" +
- "permits cannot be resolved to a type\n" +
- "----------\n" +
"3. ERROR in X.java (at line 4)\n" +
" Zork();\n" +
" ^^^^\n" +
@@ -2610,16 +2573,11 @@ public class SealedTypesTests extends AbstractRegressionTest9 {
"}",
},
"----------\n" +
- "1. WARNING in X.java (at line 3)\n" +
+ "1. ERROR in X.java (at line 3)\n" +
" for (permits i = 0; i < 10; ++i) {} \n" +
" ^^^^^^^\n" +
"\'permits\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
"----------\n" +
- "2. ERROR in X.java (at line 3)\n" +
- " for (permits i = 0; i < 10; ++i) {} \n" +
- " ^^^^^^^\n" +
- "permits cannot be resolved to a type\n" +
- "----------\n" +
"3. ERROR in X.java (at line 6)\n" +
" Zork();\n" +
" ^^^^\n" +
@@ -2666,25 +2624,15 @@ public class SealedTypesTests extends AbstractRegressionTest9 {
"}",
},
"----------\n" +
- "1. WARNING in X.java (at line 2)\n" +
+ "1. ERROR in X.java (at line 2)\n" +
" public static void main(permits[] args) {\n" +
" ^^^^^^^^^\n" +
"\'permits\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
"----------\n" +
- "2. ERROR in X.java (at line 2)\n" +
- " public static void main(permits[] args) {\n" +
- " ^^^^^^^\n" +
- "permits cannot be resolved to a type\n" +
- "----------\n" +
- "3. WARNING in X.java (at line 3)\n" +
+ "3. ERROR in X.java (at line 3)\n" +
" for (permits p : args) {} \n" +
" ^^^^^^^\n" +
"\'permits\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
- "----------\n" +
- "4. ERROR in X.java (at line 3)\n" +
- " for (permits p : args) {} \n" +
- " ^^^^^^^\n" +
- "permits cannot be resolved to a type\n" +
"----------\n",
null,
true,
@@ -2742,15 +2690,10 @@ public class SealedTypesTests extends AbstractRegressionTest9 {
"}\n",
},
"----------\n" +
- "1. WARNING in X.java (at line 3)\n" +
+ "1. ERROR in X.java (at line 3)\n" +
" try (permits y = new Y()) {\n" +
" ^^^^^^^\n" +
"\'permits\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
- "----------\n" +
- "2. ERROR in X.java (at line 3)\n" +
- " try (permits y = new Y()) {\n" +
- " ^^^^^^^\n" +
- "permits cannot be resolved to a type\n" +
"----------\n",
null,
true,
@@ -2808,15 +2751,10 @@ public class SealedTypesTests extends AbstractRegressionTest9 {
"}\n",
},
"----------\n" +
- "1. WARNING in X.java (at line 5)\n" +
+ "1. ERROR in X.java (at line 5)\n" +
" } catch (permits e) {\n" +
" ^^^^^^^\n" +
"\'permits\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
- "----------\n" +
- "2. ERROR in X.java (at line 5)\n" +
- " } catch (permits e) {\n" +
- " ^^^^^^^\n" +
- "permits cannot be resolved to a type\n" +
"----------\n",
null,
true,
@@ -2858,15 +2796,10 @@ public class SealedTypesTests extends AbstractRegressionTest9 {
" ^\n" +
"permits cannot be resolved to a type\n" +
"----------\n" +
- "2. WARNING in X.java (at line 1)\n" +
- " record X(permits p) {\n" +
- " ^^^^^^^\n" +
- "\'permits\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java 16\n" +
- "----------\n" +
- "3. ERROR in X.java (at line 1)\n" +
+ "2. ERROR in X.java (at line 1)\n" +
" record X(permits p) {\n" +
" ^^^^^^^\n" +
- "permits cannot be resolved to a type\n" +
+ "\'permits\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java 17\n" +
"----------\n",
null,
true,
@@ -2913,16 +2846,11 @@ public class SealedTypesTests extends AbstractRegressionTest9 {
"}\n",
},
"----------\n" +
- "1. WARNING in X.java (at line 5)\n" +
+ "1. ERROR in X.java (at line 5)\n" +
" <permits>this(t);\n" +
" ^^^^^^^\n" +
"\'permits\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
"----------\n" +
- "2. ERROR in X.java (at line 5)\n" +
- " <permits>this(t);\n" +
- " ^^^^^^^\n" +
- "permits cannot be resolved to a type\n" +
- "----------\n" +
"3. ERROR in X.java (at line 5)\n" +
" <permits>this(t);\n" +
" ^^^^^^^^\n" +
@@ -2980,15 +2908,10 @@ public class SealedTypesTests extends AbstractRegressionTest9 {
" ^^^^^^^^^^^^^^^^^\n" +
"The parameterized constructor <permits>X(permits) of type X is not applicable for the arguments (Integer)\n" +
"----------\n" +
- "2. WARNING in X.java (at line 5)\n" +
+ "2. ERROR in X.java (at line 5)\n" +
" new <permits>X(t).foo();\n" +
" ^^^^^^^\n" +
"\'permits\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
- "----------\n" +
- "3. ERROR in X.java (at line 5)\n" +
- " new <permits>X(t).foo();\n" +
- " ^^^^^^^\n" +
- "permits cannot be resolved to a type\n" +
"----------\n",
null,
true,
@@ -3037,16 +2960,11 @@ public class SealedTypesTests extends AbstractRegressionTest9 {
"}\n",
},
"----------\n" +
- "1. WARNING in X.java (at line 6)\n" +
+ "1. ERROR in X.java (at line 6)\n" +
" x.<permits>foo(0);\n" +
" ^^^^^^^\n" +
"\'permits\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
"----------\n" +
- "2. ERROR in X.java (at line 6)\n" +
- " x.<permits>foo(0);\n" +
- " ^^^^^^^\n" +
- "permits cannot be resolved to a type\n" +
- "----------\n" +
"3. ERROR in X.java (at line 6)\n" +
" x.<permits>foo(0);\n" +
" ^^^\n" +
@@ -3092,15 +3010,10 @@ public class SealedTypesTests extends AbstractRegressionTest9 {
"}\n",
},
"----------\n" +
- "1. WARNING in X.java (at line 5)\n" +
+ "1. ERROR in X.java (at line 5)\n" +
" X x = new permits();\n" +
" ^^^^^^^\n" +
"\'permits\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
- "----------\n" +
- "2. ERROR in X.java (at line 5)\n" +
- " X x = new permits();\n" +
- " ^^^^^^^\n" +
- "permits cannot be resolved to a type\n" +
"----------\n",
null,
true,
@@ -3157,7 +3070,7 @@ public class SealedTypesTests extends AbstractRegressionTest9 {
"}\n",
},
"----------\n" +
- "1. WARNING in X.java (at line 3)\n" +
+ "1. ERROR in X.java (at line 3)\n" +
" new permits() {\n" +
" ^^^^^^^\n" +
"\'permits\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
@@ -3167,7 +3080,7 @@ public class SealedTypesTests extends AbstractRegressionTest9 {
" ^^^^\n" +
"The method Zork() is undefined for the type new permits(){}\n" +
"----------\n" +
- "3. WARNING in X.java (at line 11)\n" +
+ "3. ERROR in X.java (at line 11)\n" +
" abstract class permits {\n" +
" ^^^^^^^\n" +
"\'permits\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
@@ -3208,15 +3121,10 @@ public class SealedTypesTests extends AbstractRegressionTest9 {
"}",
},
"----------\n" +
- "1. WARNING in X.java (at line 3)\n" +
+ "1. ERROR in X.java (at line 3)\n" +
" Object[] p = new permits[10];\n" +
" ^^^^^^^\n" +
"\'permits\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
- "----------\n" +
- "2. ERROR in X.java (at line 3)\n" +
- " Object[] p = new permits[10];\n" +
- " ^^^^^^^\n" +
- "permits cannot be resolved to a type\n" +
"----------\n",
null,
true,
@@ -3271,25 +3179,15 @@ public class SealedTypesTests extends AbstractRegressionTest9 {
" ^^^\n" +
"The method foo(permits) from the type X refers to the missing type permits\n" +
"----------\n" +
- "2. WARNING in X.java (at line 3)\n" +
+ "2. ERROR in X.java (at line 3)\n" +
" new X().foo((permits) null);\n" +
" ^^^^^^^\n" +
"\'permits\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
"----------\n" +
- "3. ERROR in X.java (at line 3)\n" +
- " new X().foo((permits) null);\n" +
- " ^^^^^^^\n" +
- "permits cannot be resolved to a type\n" +
- "----------\n" +
- "4. WARNING in X.java (at line 5)\n" +
+ "4. ERROR in X.java (at line 5)\n" +
" private void foo(permits o) {}\n" +
" ^^^^^^^\n" +
"\'permits\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
- "----------\n" +
- "5. ERROR in X.java (at line 5)\n" +
- " private void foo(permits o) {}\n" +
- " ^^^^^^^\n" +
- "permits cannot be resolved to a type\n" +
"----------\n",
null,
true,
@@ -3327,15 +3225,10 @@ public class SealedTypesTests extends AbstractRegressionTest9 {
"}",
},
"----------\n" +
- "1. WARNING in X.java (at line 3)\n" +
+ "1. ERROR in X.java (at line 3)\n" +
" if (o instanceof permits) {}\n" +
" ^^^^^^^\n" +
"\'permits\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
- "----------\n" +
- "2. ERROR in X.java (at line 3)\n" +
- " if (o instanceof permits) {}\n" +
- " ^^^^^^^\n" +
- "permits cannot be resolved to a type\n" +
"----------\n",
null,
true,
@@ -3395,7 +3288,7 @@ public class SealedTypesTests extends AbstractRegressionTest9 {
" ^^^^\n" +
"The method Zork() is undefined for the type X\n" +
"----------\n" +
- "2. WARNING in X.java (at line 8)\n" +
+ "2. ERROR in X.java (at line 8)\n" +
" class permits{}\n" +
" ^^^^^^^\n" +
"\'permits\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
@@ -3419,7 +3312,7 @@ public class SealedTypesTests extends AbstractRegressionTest9 {
"}",
},
"----------\n" +
- "1. WARNING in X.java (at line 1)\n" +
+ "1. ERROR in X.java (at line 1)\n" +
" class sealed {\n" +
" ^^^^^^\n" +
"\'sealed\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
@@ -3475,7 +3368,7 @@ public class SealedTypesTests extends AbstractRegressionTest9 {
},
"----------\n" +
"----------\n" +
- "1. WARNING in X.java (at line 2)\n" +
+ "1. ERROR in X.java (at line 2)\n" +
" sealed p;\n" +
" ^^^^^^\n" +
"\'sealed\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
@@ -3486,7 +3379,7 @@ public class SealedTypesTests extends AbstractRegressionTest9 {
"The method Zork() is undefined for the type X\n" +
"----------\n" +
"----------\n" +
- "1. WARNING in sealed.java (at line 1)\n" +
+ "1. ERROR in sealed.java (at line 1)\n" +
" public class sealed {\n" +
" ^^^^^^\n" +
"\'sealed\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
@@ -3542,7 +3435,7 @@ public class SealedTypesTests extends AbstractRegressionTest9 {
"}",
},
"----------\n" +
- "1. WARNING in X.java (at line 1)\n" +
+ "1. ERROR in X.java (at line 1)\n" +
" class X<sealed> {\n" +
" ^^^^^^\n" +
"\'sealed\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
@@ -3624,7 +3517,7 @@ public class SealedTypesTests extends AbstractRegressionTest9 {
"}",
},
"----------\n" +
- "1. WARNING in X.java (at line 1)\n" +
+ "1. ERROR in X.java (at line 1)\n" +
" class X extends sealed {\n" +
" ^^^^^^\n" +
"\'sealed\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
@@ -3634,7 +3527,7 @@ public class SealedTypesTests extends AbstractRegressionTest9 {
" ^^^^\n" +
"The method Zork() is undefined for the type X\n" +
"----------\n" +
- "3. WARNING in X.java (at line 6)\n" +
+ "3. ERROR in X.java (at line 6)\n" +
" class sealed {\n" +
" ^^^^^^\n" +
"\'sealed\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
@@ -3689,7 +3582,7 @@ public class SealedTypesTests extends AbstractRegressionTest9 {
"}",
},
"----------\n" +
- "1. WARNING in X.java (at line 1)\n" +
+ "1. ERROR in X.java (at line 1)\n" +
" class X implements sealed {\n" +
" ^^^^^^\n" +
"\'sealed\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
@@ -3699,7 +3592,7 @@ public class SealedTypesTests extends AbstractRegressionTest9 {
" ^^^^\n" +
"The method Zork() is undefined for the type X\n" +
"----------\n" +
- "3. WARNING in X.java (at line 6)\n" +
+ "3. ERROR in X.java (at line 6)\n" +
" interface sealed {\n" +
" ^^^^^^\n" +
"\'sealed\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
@@ -3754,7 +3647,7 @@ public class SealedTypesTests extends AbstractRegressionTest9 {
"}",
},
"----------\n" +
- "1. WARNING in X.java (at line 1)\n" +
+ "1. ERROR in X.java (at line 1)\n" +
" interface X extends sealed {\n" +
" ^^^^^^\n" +
"\'sealed\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
@@ -3764,7 +3657,7 @@ public class SealedTypesTests extends AbstractRegressionTest9 {
" ^^^^\n" +
"The method Zork() is undefined for the type X\n" +
"----------\n" +
- "3. WARNING in X.java (at line 6)\n" +
+ "3. ERROR in X.java (at line 6)\n" +
" interface sealed {\n" +
" ^^^^^^\n" +
"\'sealed\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
@@ -3817,16 +3710,11 @@ public class SealedTypesTests extends AbstractRegressionTest9 {
"}",
},
"----------\n" +
- "1. WARNING in X.java (at line 2)\n" +
+ "1. ERROR in X.java (at line 2)\n" +
" sealed foo() {\n" +
" ^^^^^^\n" +
"\'sealed\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
"----------\n" +
- "2. ERROR in X.java (at line 2)\n" +
- " sealed foo() {\n" +
- " ^^^^^^\n" +
- "sealed cannot be resolved to a type\n" +
- "----------\n" +
"3. ERROR in X.java (at line 3)\n" +
" Zork();\n" +
" ^^^^\n" +
@@ -3873,16 +3761,11 @@ public class SealedTypesTests extends AbstractRegressionTest9 {
"}",
},
"----------\n" +
- "1. WARNING in X.java (at line 2)\n" +
+ "1. ERROR in X.java (at line 2)\n" +
" void foo() throws sealed{\n" +
" ^^^^^^\n" +
"\'sealed\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
"----------\n" +
- "2. ERROR in X.java (at line 2)\n" +
- " void foo() throws sealed{\n" +
- " ^^^^^^\n" +
- "sealed cannot be resolved to a type\n" +
- "----------\n" +
"3. ERROR in X.java (at line 3)\n" +
" Zork();\n" +
" ^^^^\n" +
@@ -3944,16 +3827,11 @@ public class SealedTypesTests extends AbstractRegressionTest9 {
"}",
},
"----------\n" +
- "1. WARNING in X.java (at line 1)\n" +
+ "1. ERROR in X.java (at line 1)\n" +
" class X <T extends sealed>{\n" +
" ^^^^^^\n" +
"\'sealed\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
"----------\n" +
- "2. ERROR in X.java (at line 1)\n" +
- " class X <T extends sealed>{\n" +
- " ^^^^^^\n" +
- "sealed cannot be resolved to a type\n" +
- "----------\n" +
"3. ERROR in X.java (at line 1)\n" +
" class X <T extends sealed>{\n" +
" ^\n" +
@@ -4019,16 +3897,11 @@ public class SealedTypesTests extends AbstractRegressionTest9 {
"}",
},
"----------\n" +
- "1. WARNING in X.java (at line 3)\n" +
+ "1. ERROR in X.java (at line 3)\n" +
" private final sealed p;\n" +
" ^^^^^^\n" +
"\'sealed\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
"----------\n" +
- "2. ERROR in X.java (at line 3)\n" +
- " private final sealed p;\n" +
- " ^^^^^^\n" +
- "sealed cannot be resolved to a type\n" +
- "----------\n" +
"3. ERROR in X.java (at line 5)\n" +
" Zork();\n" +
" ^^^^\n" +
@@ -4088,16 +3961,11 @@ public class SealedTypesTests extends AbstractRegressionTest9 {
" ^^^^^^^^^^^^\n" +
"This lambda expression refers to the missing type sealed\n" +
"----------\n" +
- "2. WARNING in X.java (at line 3)\n" +
+ "2. ERROR in X.java (at line 3)\n" +
" I i = (sealed p)-> {};\n" +
" ^^^^^^\n" +
"\'sealed\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
"----------\n" +
- "3. ERROR in X.java (at line 3)\n" +
- " I i = (sealed p)-> {};\n" +
- " ^^^^^^\n" +
- "sealed cannot be resolved to a type\n" +
- "----------\n" +
"4. ERROR in X.java (at line 4)\n" +
" Zork();\n" +
" ^^^^\n" +
@@ -4135,15 +4003,10 @@ public class SealedTypesTests extends AbstractRegressionTest9 {
"}",
},
"----------\n" +
- "1. WARNING in X.java (at line 2)\n" +
+ "1. ERROR in X.java (at line 2)\n" +
" public void foo(sealed this) {}\n" +
" ^^^^^^\n" +
"\'sealed\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
- "----------\n" +
- "2. ERROR in X.java (at line 2)\n" +
- " public void foo(sealed this) {}\n" +
- " ^^^^^^\n" +
- "sealed cannot be resolved to a type\n" +
"----------\n",
null,
true,
@@ -4177,15 +4040,10 @@ public class SealedTypesTests extends AbstractRegressionTest9 {
"}",
},
"----------\n" +
- "1. WARNING in X.java (at line 2)\n" +
+ "1. ERROR in X.java (at line 2)\n" +
" public void foo(sealed this) {}\n" +
" ^^^^^^\n" +
"\'sealed\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
- "----------\n" +
- "2. ERROR in X.java (at line 2)\n" +
- " public void foo(sealed this) {}\n" +
- " ^^^^^^\n" +
- "sealed cannot be resolved to a type\n" +
"----------\n",
null,
true,
@@ -4228,12 +4086,12 @@ public class SealedTypesTests extends AbstractRegressionTest9 {
"}",
},
"----------\n" +
- "1. WARNING in X.java (at line 2)\n" +
+ "1. ERROR in X.java (at line 2)\n" +
" class sealed {\n" +
" ^^^^^^\n" +
"\'sealed\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
"----------\n" +
- "2. WARNING in X.java (at line 3)\n" +
+ "2. ERROR in X.java (at line 3)\n" +
" public void foo(sealed this) {}\n" +
" ^^^^^^\n" +
"\'sealed\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
@@ -4281,16 +4139,11 @@ public class SealedTypesTests extends AbstractRegressionTest9 {
"}",
},
"----------\n" +
- "1. WARNING in X.java (at line 3)\n" +
+ "1. ERROR in X.java (at line 3)\n" +
" sealed p;\n" +
" ^^^^^^\n" +
"\'sealed\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
"----------\n" +
- "2. ERROR in X.java (at line 3)\n" +
- " sealed p;\n" +
- " ^^^^^^\n" +
- "sealed cannot be resolved to a type\n" +
- "----------\n" +
"3. ERROR in X.java (at line 4)\n" +
" Zork();\n" +
" ^^^^\n" +
@@ -4343,16 +4196,11 @@ public class SealedTypesTests extends AbstractRegressionTest9 {
"}",
},
"----------\n" +
- "1. WARNING in X.java (at line 3)\n" +
+ "1. ERROR in X.java (at line 3)\n" +
" for (sealed i = 0; i < 10; ++i) {} \n" +
" ^^^^^^\n" +
"\'sealed\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
"----------\n" +
- "2. ERROR in X.java (at line 3)\n" +
- " for (sealed i = 0; i < 10; ++i) {} \n" +
- " ^^^^^^\n" +
- "sealed cannot be resolved to a type\n" +
- "----------\n" +
"3. ERROR in X.java (at line 6)\n" +
" Zork();\n" +
" ^^^^\n" +
@@ -4399,25 +4247,15 @@ public class SealedTypesTests extends AbstractRegressionTest9 {
"}",
},
"----------\n" +
- "1. WARNING in X.java (at line 2)\n" +
+ "1. ERROR in X.java (at line 2)\n" +
" public static void main(sealed[] args) {\n" +
" ^^^^^^^^\n" +
"\'sealed\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
"----------\n" +
- "2. ERROR in X.java (at line 2)\n" +
- " public static void main(sealed[] args) {\n" +
- " ^^^^^^\n" +
- "sealed cannot be resolved to a type\n" +
- "----------\n" +
- "3. WARNING in X.java (at line 3)\n" +
+ "3. ERROR in X.java (at line 3)\n" +
" for (sealed p : args) {} \n" +
" ^^^^^^\n" +
"\'sealed\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
- "----------\n" +
- "4. ERROR in X.java (at line 3)\n" +
- " for (sealed p : args) {} \n" +
- " ^^^^^^\n" +
- "sealed cannot be resolved to a type\n" +
"----------\n",
null,
true,
@@ -4475,15 +4313,10 @@ public class SealedTypesTests extends AbstractRegressionTest9 {
"}\n",
},
"----------\n" +
- "1. WARNING in X.java (at line 3)\n" +
+ "1. ERROR in X.java (at line 3)\n" +
" try (sealed y = new Y()) {\n" +
" ^^^^^^\n" +
"\'sealed\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
- "----------\n" +
- "2. ERROR in X.java (at line 3)\n" +
- " try (sealed y = new Y()) {\n" +
- " ^^^^^^\n" +
- "sealed cannot be resolved to a type\n" +
"----------\n",
null,
true,
@@ -4541,15 +4374,10 @@ public class SealedTypesTests extends AbstractRegressionTest9 {
"}\n",
},
"----------\n" +
- "1. WARNING in X.java (at line 5)\n" +
+ "1. ERROR in X.java (at line 5)\n" +
" } catch (sealed e) {\n" +
" ^^^^^^\n" +
"\'sealed\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
- "----------\n" +
- "2. ERROR in X.java (at line 5)\n" +
- " } catch (sealed e) {\n" +
- " ^^^^^^\n" +
- "sealed cannot be resolved to a type\n" +
"----------\n",
null,
true,
@@ -4591,15 +4419,10 @@ public class SealedTypesTests extends AbstractRegressionTest9 {
" ^\n" +
"sealed cannot be resolved to a type\n" +
"----------\n" +
- "2. WARNING in X.java (at line 1)\n" +
- " record X(sealed p) {\n" +
- " ^^^^^^\n" +
- "\'sealed\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java 16\n" +
- "----------\n" +
- "3. ERROR in X.java (at line 1)\n" +
+ "2. ERROR in X.java (at line 1)\n" +
" record X(sealed p) {\n" +
" ^^^^^^\n" +
- "sealed cannot be resolved to a type\n" +
+ "\'sealed\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java 17\n" +
"----------\n",
null,
true,
@@ -4646,16 +4469,11 @@ public class SealedTypesTests extends AbstractRegressionTest9 {
"}\n",
},
"----------\n" +
- "1. WARNING in X.java (at line 5)\n" +
+ "1. ERROR in X.java (at line 5)\n" +
" <sealed>this(t);\n" +
" ^^^^^^\n" +
"\'sealed\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
"----------\n" +
- "2. ERROR in X.java (at line 5)\n" +
- " <sealed>this(t);\n" +
- " ^^^^^^\n" +
- "sealed cannot be resolved to a type\n" +
- "----------\n" +
"3. ERROR in X.java (at line 5)\n" +
" <sealed>this(t);\n" +
" ^^^^^^^^\n" +
@@ -4713,15 +4531,10 @@ public class SealedTypesTests extends AbstractRegressionTest9 {
" ^^^^^^^^^^^^^^^^\n" +
"The parameterized constructor <sealed>X(sealed) of type X is not applicable for the arguments (Integer)\n" +
"----------\n" +
- "2. WARNING in X.java (at line 5)\n" +
+ "2. ERROR in X.java (at line 5)\n" +
" new <sealed>X(t).foo();\n" +
" ^^^^^^\n" +
"\'sealed\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
- "----------\n" +
- "3. ERROR in X.java (at line 5)\n" +
- " new <sealed>X(t).foo();\n" +
- " ^^^^^^\n" +
- "sealed cannot be resolved to a type\n" +
"----------\n",
null,
true,
@@ -4770,16 +4583,11 @@ public class SealedTypesTests extends AbstractRegressionTest9 {
"}\n",
},
"----------\n" +
- "1. WARNING in X.java (at line 6)\n" +
+ "1. ERROR in X.java (at line 6)\n" +
" x.<sealed>foo(0);\n" +
" ^^^^^^\n" +
"\'sealed\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
"----------\n" +
- "2. ERROR in X.java (at line 6)\n" +
- " x.<sealed>foo(0);\n" +
- " ^^^^^^\n" +
- "sealed cannot be resolved to a type\n" +
- "----------\n" +
"3. ERROR in X.java (at line 6)\n" +
" x.<sealed>foo(0);\n" +
" ^^^\n" +
@@ -4825,15 +4633,10 @@ public class SealedTypesTests extends AbstractRegressionTest9 {
"}\n",
},
"----------\n" +
- "1. WARNING in X.java (at line 5)\n" +
+ "1. ERROR in X.java (at line 5)\n" +
" X x = new sealed();\n" +
" ^^^^^^\n" +
"\'sealed\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
- "----------\n" +
- "2. ERROR in X.java (at line 5)\n" +
- " X x = new sealed();\n" +
- " ^^^^^^\n" +
- "sealed cannot be resolved to a type\n" +
"----------\n",
null,
true,
@@ -4890,7 +4693,7 @@ public class SealedTypesTests extends AbstractRegressionTest9 {
"}\n",
},
"----------\n" +
- "1. WARNING in X.java (at line 3)\n" +
+ "1. ERROR in X.java (at line 3)\n" +
" new sealed() {\n" +
" ^^^^^^\n" +
"\'sealed\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
@@ -4900,7 +4703,7 @@ public class SealedTypesTests extends AbstractRegressionTest9 {
" ^^^^\n" +
"The method Zork() is undefined for the type new sealed(){}\n" +
"----------\n" +
- "3. WARNING in X.java (at line 11)\n" +
+ "3. ERROR in X.java (at line 11)\n" +
" abstract class sealed {\n" +
" ^^^^^^\n" +
"\'sealed\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
@@ -4941,15 +4744,10 @@ public class SealedTypesTests extends AbstractRegressionTest9 {
"}",
},
"----------\n" +
- "1. WARNING in X.java (at line 3)\n" +
+ "1. ERROR in X.java (at line 3)\n" +
" Object[] p = new sealed[10];\n" +
" ^^^^^^\n" +
"\'sealed\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
- "----------\n" +
- "2. ERROR in X.java (at line 3)\n" +
- " Object[] p = new sealed[10];\n" +
- " ^^^^^^\n" +
- "sealed cannot be resolved to a type\n" +
"----------\n",
null,
true,
@@ -5004,25 +4802,15 @@ public class SealedTypesTests extends AbstractRegressionTest9 {
" ^^^\n" +
"The method foo(sealed) from the type X refers to the missing type sealed\n" +
"----------\n" +
- "2. WARNING in X.java (at line 3)\n" +
+ "2. ERROR in X.java (at line 3)\n" +
" new X().foo((sealed) null);\n" +
" ^^^^^^\n" +
"\'sealed\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
"----------\n" +
- "3. ERROR in X.java (at line 3)\n" +
- " new X().foo((sealed) null);\n" +
- " ^^^^^^\n" +
- "sealed cannot be resolved to a type\n" +
- "----------\n" +
- "4. WARNING in X.java (at line 5)\n" +
+ "4. ERROR in X.java (at line 5)\n" +
" private void foo(sealed o) {}\n" +
" ^^^^^^\n" +
"\'sealed\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
- "----------\n" +
- "5. ERROR in X.java (at line 5)\n" +
- " private void foo(sealed o) {}\n" +
- " ^^^^^^\n" +
- "sealed cannot be resolved to a type\n" +
"----------\n",
null,
true,
@@ -5060,15 +4848,10 @@ public class SealedTypesTests extends AbstractRegressionTest9 {
"}",
},
"----------\n" +
- "1. WARNING in X.java (at line 3)\n" +
+ "1. ERROR in X.java (at line 3)\n" +
" if (o instanceof sealed) {}\n" +
" ^^^^^^\n" +
"\'sealed\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
- "----------\n" +
- "2. ERROR in X.java (at line 3)\n" +
- " if (o instanceof sealed) {}\n" +
- " ^^^^^^\n" +
- "sealed cannot be resolved to a type\n" +
"----------\n",
null,
true,
@@ -5128,7 +4911,7 @@ public class SealedTypesTests extends AbstractRegressionTest9 {
" ^^^^\n" +
"The method Zork() is undefined for the type X\n" +
"----------\n" +
- "2. WARNING in X.java (at line 8)\n" +
+ "2. ERROR in X.java (at line 8)\n" +
" class sealed{}\n" +
" ^^^^^^\n" +
"\'sealed\' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java "+ AbstractRegressionTest.PREVIEW_ALLOWED_LEVEL +"\n" +
@@ -5304,31 +5087,16 @@ public class SealedTypesTests extends AbstractRegressionTest9 {
"final class Z implements I{}",
},
"----------\n" +
- "1. WARNING in X.java (at line 1)\n" +
- " public sealed class X permits Y {Zork();\n" +
- " ^^^^^^\n" +
- "You are using a preview language feature that may or may not be supported in a future release\n" +
- "----------\n" +
- "2. WARNING in X.java (at line 1)\n" +
- " public sealed class X permits Y {Zork();\n" +
- " ^^^^^^^\n" +
- "You are using a preview language feature that may or may not be supported in a future release\n" +
- "----------\n" +
- "3. ERROR in X.java (at line 1)\n" +
- " public sealed class X permits Y {Zork();\n" +
- " ^^^^^^\n" +
- "Return type for the method is missing\n" +
- "----------\n" +
- "4. ERROR in X.java (at line 1)\n" +
- " public sealed class X permits Y {Zork();\n" +
- " ^^^^^^\n" +
- "This method requires a body instead of a semicolon\n" +
- "----------\n" +
- "5. WARNING in X.java (at line 4)\n" +
- " sealed interface I{}\n" +
- " ^^^^^^\n" +
- "You are using a preview language feature that may or may not be supported in a future release\n" +
- "----------\n",
+ "1. ERROR in X.java (at line 1)\n" +
+ " public sealed class X permits Y {Zork();\n" +
+ " ^^^^^^\n" +
+ "Return type for the method is missing\n" +
+ "----------\n" +
+ "2. ERROR in X.java (at line 1)\n" +
+ " public sealed class X permits Y {Zork();\n" +
+ " ^^^^^^\n" +
+ "This method requires a body instead of a semicolon\n" +
+ "----------\n",
null,
true,
options
@@ -5566,7 +5334,6 @@ public class SealedTypesTests extends AbstractRegressionTest9 {
"X.java",
"import java.lang.reflect.Modifier;\n"+
"\n"+
- "@SuppressWarnings(\"preview\")\n"+
"sealed interface I {\n"+
" void foo();\n"+
"}\n"+
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
new file mode 100644
index 000000000..5a21459df
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/SwitchPatternTest.java
@@ -0,0 +1,4046 @@
+/*******************************************************************************
+ * Copyright (c) 2021 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * This is an implementation of an early-draft specification developed under the Java
+ * Community Process (JCP) and is made available for testing and evaluation purposes
+ * only. The code is not compatible with any specification of the JCP.
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jdt.core.tests.compiler.regression;
+
+import java.util.Map;
+
+import org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
+
+import junit.framework.Test;
+
+public class SwitchPatternTest extends AbstractRegressionTest9 {
+
+ static {
+// TESTS_NUMBERS = new int [] { 40 };
+// TESTS_RANGE = new int[] { 1, -1 };
+// TESTS_NAMES = new String[] { "testBug575737"};
+ }
+
+ private static String previewLevel = "17";
+
+ public static Class<?> testClass() {
+ return SwitchPatternTest.class;
+ }
+ public static Test suite() {
+ return buildMinimalComplianceTestSuite(testClass(), F_17);
+ }
+ public SwitchPatternTest(String testName){
+ super(testName);
+ }
+
+ // Enables the tests to run individually
+ protected Map<String, String> getCompilerOptions() {
+ Map<String, String> defaultOptions = super.getCompilerOptions();
+ defaultOptions.put(CompilerOptions.OPTION_Compliance, CompilerOptions.VERSION_17); // FIXME
+ defaultOptions.put(CompilerOptions.OPTION_Source, CompilerOptions.VERSION_17);
+ defaultOptions.put(CompilerOptions.OPTION_TargetPlatform, CompilerOptions.VERSION_17);
+ defaultOptions.put(CompilerOptions.OPTION_EnablePreviews, CompilerOptions.ENABLED);
+ defaultOptions.put(CompilerOptions.OPTION_ReportPreviewFeatures, CompilerOptions.IGNORE);
+ defaultOptions.put(CompilerOptions.OPTION_Store_Annotations, CompilerOptions.ENABLED);
+ return defaultOptions;
+ }
+
+ @Override
+ protected void runConformTest(String[] testFiles, String expectedOutput) {
+ runConformTest(testFiles, expectedOutput, "", getCompilerOptions());
+ }
+ @Override
+ protected void runConformTest(String[] testFiles, String expectedOutput, Map<String, String> customOptions) {
+ runConformTest(testFiles, expectedOutput, "", customOptions);
+ }
+ protected void runConformTest(String[] testFiles, String expectedOutput, String errorOutput) {
+ runConformTest(testFiles, expectedOutput, errorOutput, getCompilerOptions());
+ }
+ protected void runConformTest(String[] testFiles, String expectedOutput, String expectedErrorOutput, Map<String, String> customOptions) {
+ Runner runner = new Runner();
+ runner.testFiles = testFiles;
+ runner.expectedOutputString = expectedOutput;
+ runner.expectedErrorString = expectedErrorOutput;
+ runner.vmArguments = new String[] {"--enable-preview"};
+ runner.customOptions = customOptions;
+ runner.javacTestOptions = JavacTestOptions.forReleaseWithPreview(SwitchPatternTest.previewLevel);
+ runner.runConformTest();
+ }
+ @Override
+ protected void runNegativeTest(String[] testFiles, String expectedCompilerLog) {
+ runNegativeTest(testFiles, expectedCompilerLog, "");
+ }
+ protected void runNegativeTest(String[] testFiles, String expectedCompilerLog, String javacLog) {
+ Runner runner = new Runner();
+ runner.testFiles = testFiles;
+ runner.expectedCompilerLog = expectedCompilerLog;
+ runner.expectedJavacOutputString = expectedCompilerLog;
+ runner.vmArguments = new String[] {"--enable-preview"};
+ runner.customOptions = getCompilerOptions();
+ runner.javacTestOptions = JavacTestOptions.forReleaseWithPreview(SwitchPatternTest.previewLevel);
+ runner.runNegativeTest();
+ runNegativeTest(testFiles, expectedCompilerLog, JavacTestOptions.forReleaseWithPreview(SwitchPatternTest.previewLevel));
+ }
+ protected void runWarningTest(String[] testFiles, String expectedCompilerLog) {
+ runWarningTest(testFiles, expectedCompilerLog, null);
+ }
+ protected void runWarningTest(String[] testFiles, String expectedCompilerLog, Map<String, String> customOptions) {
+ runWarningTest(testFiles, expectedCompilerLog, customOptions, null);
+ }
+ protected void runWarningTest(String[] testFiles, String expectedCompilerLog,
+ Map<String, String> customOptions, String javacAdditionalTestOptions) {
+
+ Runner runner = new Runner();
+ runner.testFiles = testFiles;
+ runner.expectedCompilerLog = expectedCompilerLog;
+ runner.customOptions = customOptions;
+ runner.vmArguments = new String[] {"--enable-preview"};
+ runner.javacTestOptions = javacAdditionalTestOptions == null ? JavacTestOptions.forReleaseWithPreview(SwitchPatternTest.previewLevel) :
+ JavacTestOptions.forReleaseWithPreview(SwitchPatternTest.previewLevel, javacAdditionalTestOptions);
+ runner.runWarningTest();
+ }
+
+ public void testBug573516_001() {
+ runConformTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " private static void foo(Object o) {\n"+
+ " switch (o) {\n"+
+ " case Integer i -> System.out.println(\"String:\");\n"+
+ " case String s -> System.out.println(\"String: Hello World!\");\n"+
+ " default -> System.out.println(\"Object\");\n"+
+ " }\n"+
+ " }\n"+
+ " public static void main(String[] args) {\n"+
+ " foo(\"Hello World\");\n"+
+ " }\n"+
+ "}",
+ },
+ "String: Hello World!");
+ }
+ public void testBug573516_002() {
+ runNegativeTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " private static void foo(Object o) {\n"+
+ " switch (o) {\n"+
+ " case String s -> System.out.println(\"String:\");\n"+
+ " default -> System.out.println(\"Object\");\n"+
+ " }\n"+
+ " }\n"+
+ " public static void main(String[] args) {\n"+
+ " foo(\"Hello World\");\n"+
+ " Zork();\n"+
+ " }\n"+
+ "}",
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 10)\n" +
+ " Zork();\n" +
+ " ^^^^\n" +
+ "The method Zork() is undefined for the type X\n" +
+ "----------\n");
+ }
+ public void testBug573516_003() {
+ runNegativeTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " private static void foo(Object o) {\n"+
+ " switch (o) {\n"+
+ " case String s : System.out.println(\"String:\"); break;\n"+
+ " case Integer i : System.out.println(\"Integer:\");break;\n"+
+ " default : System.out.println(\"Object\");break;\n"+
+ " }\n"+
+ " }\n"+
+ " public static void main(String[] args) {\n"+
+ " foo(\"Hello World\");\n"+
+ " Zork();\n"+
+ " }\n"+
+ "}",
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 11)\n" +
+ " Zork();\n" +
+ " ^^^^\n" +
+ "The method Zork() is undefined for the type X\n" +
+ "----------\n");
+ }
+ public void testBug573516_004() {
+ runNegativeTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " private static void foo(Object o) {\n"+
+ " switch (o) {\n"+
+ " case Integer t && t > 0 -> System.out.println(\"Integer && t > 0\");\n"+
+ " default -> System.out.println(\"Object\");\n"+
+ " }\n"+
+ " }\n"+
+ " public static void main(String[] args) {\n"+
+ " foo(\"Hello World\");\n"+
+ " Zork();\n"+
+ " }\n"+
+ "}",
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 10)\n" +
+ " Zork();\n" +
+ " ^^^^\n" +
+ "The method Zork() is undefined for the type X\n" +
+ "----------\n");
+ }
+ public void testBug573516_005() {
+ runNegativeTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " private static void foo(Object o) {\n"+
+ " switch (o) {\n"+
+ " case Integer t, String s, X x : System.out.println(\"Integer, String or X\");\n"+
+ " default : System.out.println(\"Object\");\n"+
+ " }\n"+
+ " }\n"+
+ " public static void main(String[] args) {\n"+
+ " foo(\"Hello World\");\n"+
+ " Zork();\n"+
+ " }\n"+
+ "}\n"+
+ "class Y {}",
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 4)\n" +
+ " case Integer t, String s, X x : System.out.println(\"Integer, String or X\");\n" +
+ " ^^^^^^^^\n" +
+ "A switch label may not have more than one pattern case label element\n" +
+ "----------\n" +
+ "3. ERROR in X.java (at line 10)\n" +
+ " Zork();\n" +
+ " ^^^^\n" +
+ "The method Zork() is undefined for the type X\n" +
+ "----------\n");
+ }
+ public void testBug573516_006() {
+ runNegativeTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " private static void foo(Object o) {\n"+
+ " switch (o) {\n"+
+ " case Integer t, String s && s.length > 0, X x && x.hashCode() > 10 : System.out.println(\"Integer, String or X\");\n"+
+ " default : System.out.println(\"Object\");\n"+
+ " }\n"+
+ " }\n"+
+ " public static void main(String[] args) {\n"+
+ " foo(\"Hello World\");\n"+
+ " Zork();\n"+
+ " }\n"+
+ "}\n"+
+ "class Y {}",
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 4)\n" +
+ " case Integer t, String s && s.length > 0, X x && x.hashCode() > 10 : System.out.println(\"Integer, String or X\");\n" +
+ " ^^^^^^^^^^^^^^^^^^^^^^^^\n" +
+ "A switch label may not have more than one pattern case label element\n" +
+ "----------\n" +
+ "2. ERROR in X.java (at line 4)\n" +
+ " case Integer t, String s && s.length > 0, X x && x.hashCode() > 10 : System.out.println(\"Integer, String or X\");\n" +
+ " ^^^^^^\n" +
+ "length cannot be resolved or is not a field\n" +
+ "----------\n" +
+ "3. ERROR in X.java (at line 10)\n" +
+ " Zork();\n" +
+ " ^^^^\n" +
+ "The method Zork() is undefined for the type X\n" +
+ "----------\n");
+ }
+ public void testBug573516_007() {
+ runNegativeTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " private static void foo(Object o) {\n"+
+ " switch (o) {\n"+
+ " case Integer t, String : System.out.println(\"Error should be flagged for String\");\n"+
+ " default : System.out.println(\"Object\");\n"+
+ " }\n"+
+ " }\n"+
+ " public static void main(String[] args) {\n"+
+ " foo(\"Hello World\");\n"+
+ " Zork();\n"+
+ " }\n"+
+ "}\n"+
+ "class Y {}",
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 4)\n" +
+ " case Integer t, String : System.out.println(\"Error should be flagged for String\");\n" +
+ " ^^^^^^\n" +
+ "String cannot be resolved to a variable\n" +
+ "----------\n" +
+ "2. ERROR in X.java (at line 10)\n" +
+ " Zork();\n" +
+ " ^^^^\n" +
+ "The method Zork() is undefined for the type X\n" +
+ "----------\n");
+ }
+ public void testBug573516_008() {
+ runNegativeTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " private static void foo(Object o) {\n"+
+ " switch (o.hashCode()) {\n"+
+ " case Integer t, String : System.out.println(\"Error should be flagged for Integer and String\");\n"+
+ " default : System.out.println(\"Object\");\n"+
+ " }\n"+
+ " }\n"+
+ " public static void main(String[] args) {\n"+
+ " foo(\"Hello World\");\n"+
+ " Zork();\n"+
+ " }\n"+
+ "}\n"+
+ "class Y {}",
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 4)\n" +
+ " case Integer t, String : System.out.println(\"Error should be flagged for Integer and String\");\n" +
+ " ^^^^^^^^^\n" +
+ "Type mismatch: cannot convert from int to Integer\n" +
+ "----------\n" +
+ "2. ERROR in X.java (at line 4)\n" +
+ " case Integer t, String : System.out.println(\"Error should be flagged for Integer and String\");\n" +
+ " ^^^^^^\n" +
+ "String cannot be resolved to a variable\n" +
+ "----------\n" +
+ "3. ERROR in X.java (at line 10)\n" +
+ " Zork();\n" +
+ " ^^^^\n" +
+ "The method Zork() is undefined for the type X\n" +
+ "----------\n");
+ }
+ public void testBug573516_009() {
+ runNegativeTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " private static void foo(Object o) {\n"+
+ " switch (o.hashCode()) {\n"+
+ " case default : System.out.println(\"Default\");\n"+
+ " default : System.out.println(\"Object\");\n"+
+ " }\n"+
+ " }\n"+
+ " public static void main(String[] args) {\n"+
+ " foo(\"Hello World\");\n"+
+ " Zork();\n"+
+ " }\n"+
+ "}\n"+
+ "class Y {}",
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 5)\n" +
+ " default : System.out.println(\"Object\");\n" +
+ " ^^^^^^^\n" +
+ "The default case is already defined\n" +
+ "----------\n" +
+ "2. ERROR in X.java (at line 10)\n" +
+ " Zork();\n" +
+ " ^^^^\n" +
+ "The method Zork() is undefined for the type X\n" +
+ "----------\n");
+ }
+ public void testBug573516_010() {
+ runNegativeTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " private static void foo(Object o) {\n"+
+ " switch (o.hashCode()) {\n"+
+ " case String s, default : System.out.println(\"Error should be flagged for String and default\");\n"+
+ " default : System.out.println(\"Object\");\n"+
+ " }\n"+
+ " }\n"+
+ " public static void main(String[] args) {\n"+
+ " foo(\"Hello World\");\n"+
+ " Zork();\n"+
+ " }\n"+
+ "}\n"+
+ "class Y {}",
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 4)\n" +
+ " case String s, default : System.out.println(\"Error should be flagged for String and default\");\n" +
+ " ^^^^^^^^\n" +
+ "Type mismatch: cannot convert from int to String\n" +
+ "----------\n" +
+ "2. ERROR in X.java (at line 4)\n" +
+ " case String s, default : System.out.println(\"Error should be flagged for String and default\");\n" +
+ " ^^^^^^^\n" +
+ "A switch label may not have both a pattern case label element and a default case label element\n" +
+ "----------\n" +
+ "3. ERROR in X.java (at line 5)\n" +
+ " default : System.out.println(\"Object\");\n" +
+ " ^^^^^^^\n" +
+ "The default case is already defined\n" +
+ "----------\n" +
+ "4. ERROR in X.java (at line 10)\n" +
+ " Zork();\n" +
+ " ^^^^\n" +
+ "The method Zork() is undefined for the type X\n" +
+ "----------\n");
+ }
+ public void testBug573516_011() {
+ runNegativeTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " private static void foo(Object o) {\n"+
+ " switch (o.hashCode()) {\n"+
+ " case var s : System.out.println(\"Error should be ANY_PATTERN\");\n"+
+ " default : System.out.println(\"Object\");\n"+
+ " }\n"+
+ " }\n"+
+ " public static void main(String[] args) {\n"+
+ " foo(\"Hello World\");\n"+
+ " Zork();\n"+
+ " }\n"+
+ "}\n"+
+ "class Y {}",
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 4)\n" +
+ " case var s : System.out.println(\"Error should be ANY_PATTERN\");\n" +
+ " ^^^\n" +
+ "'var' is not allowed here\n" +
+ "----------\n" +
+ "2. ERROR in X.java (at line 10)\n" +
+ " Zork();\n" +
+ " ^^^^\n" +
+ "The method Zork() is undefined for the type X\n" +
+ "----------\n");
+ }
+ public void testBug574228_001() {
+ runNegativeTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " private static void foo(Object o) {\n"+
+ " switch (o) {\n"+
+ " case 1: System.out.println(\"Integer\"); break;\n"+
+ " default : System.out.println(\"Object\");\n"+
+ " }\n"+
+ " }\n"+
+ " public static void main(String[] args) {\n"+
+ " foo(\"Hello World\");\n"+
+ " Zork();\n"+
+ " }\n"+
+ "}",
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 4)\n" +
+ " case 1: System.out.println(\"Integer\"); break;\n" +
+ " ^\n" +
+ "Type mismatch: cannot convert from int to Object\n" +
+ "----------\n" +
+ "2. ERROR in X.java (at line 10)\n" +
+ " Zork();\n" +
+ " ^^^^\n" +
+ "The method Zork() is undefined for the type X\n" +
+ "----------\n");
+ }
+
+ public void testBug573936_01() {
+ this.runNegativeTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " private static void foo(Object o) {\n"+
+ " switch (o) {\n"+
+ " case Integer I: \n"+
+ " System.out.println(\"Integer\"); \n"+
+ " System.out.println(I); \n"+
+ " case String s && s.length()>1: \n"+
+ " System.out.println(\"String s && s.length()>1\"); \n"+
+ " System.out.println(s); \n"+
+ " break;// error no fallthrough allowed in pattern\n"+
+ " case X x:\n"+
+ " System.out.println(\"X\"); \n"+
+ " System.out.println(x);\n"+
+ " break;\n"+
+ " default : System.out.println(\"Object\"); \n"+
+ " }\n"+
+ " } \n"+
+ " public static void main(String[] args) {\n"+
+ " foo(\"Hello World!\");\n"+
+ " foo(\"H\");\n"+
+ " foo(bar());\n"+
+ " }\n"+
+ " public static Object bar() { return new Object();}\n"+
+ "}",
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 7)\n" +
+ " case String s && s.length()>1: \n" +
+ " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
+ "Illegal fall-through to a pattern\n" +
+ "----------\n");
+ }
+ public void testBug573939_01() {
+ runNegativeTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " private static void foo(Object o) {\n"+
+ " switch (o) {\n"+
+ " case Integer s : System.out.println(\"Integer\");\n"+
+ " case String s1: System.out.println(\"String \");\n"+
+ " default : System.out.println(\"Object\");\n"+
+ " }\n"+
+ " }\n"+
+ " public static void main(String[] args) {\n"+
+ " foo(\"Hello World\");\n"+
+ " Zork();\n"+
+ " }\n"+
+ "}\n"+
+ "class Y {}",
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 5)\n" +
+ " case String s1: System.out.println(\"String \");\n" +
+ " ^^^^^^^^^^^^^^\n" +
+ "Illegal fall-through to a pattern\n" +
+ "----------\n" +
+ "2. ERROR in X.java (at line 11)\n" +
+ " Zork();\n" +
+ " ^^^^\n" +
+ "The method Zork() is undefined for the type X\n" +
+ "----------\n");
+ }
+ public void testBug573939_02() {
+ this.runConformTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " private static void foo(Object o) {\n"+
+ " switch (o) {\n"+
+ " case Integer I: System.out.println(\"Integer\"); break;\n"+
+ " case String s && s.length()>1: System.out.println(\"String > 1\"); break;\n"+
+ " case String s1: System.out.println(\"String\"); break;\n"+
+ " case X x: System.out.println(\"X\"); break;\n"+
+ " default : System.out.println(\"Object\");\n"+
+ " }\n"+
+ " }\n"+
+ " public static void main(String[] args) {\n"+
+ " foo(\"Hello World!\");\n"+
+ " foo(\"H\");\n"+
+ " foo(bar());\n"+
+ " }\n"+
+ " public static Object bar() { return new Object();}\n"+
+ "}",
+ },
+ "String > 1\n" +
+ "String\n" +
+ "Object");
+ }
+ public void testBug573939_03() {
+ this.runConformTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " private static void foo(Object o) {\n"+
+ " switch (o) {\n"+
+ " case Integer I: \n"+
+ " System.out.println(\"Integer\"); \n"+
+ " System.out.println(I); \n"+
+ " break; \n"+
+ " case String s && s.length()>1: \n"+
+ " System.out.println(\"String s && s.length()>1\"); \n"+
+ " System.out.println(s); \n"+
+ " break;\n"+
+ " case String s1: \n"+
+ " System.out.println(\"String\"); \n"+
+ " System.out.println(s1);\n"+
+ " break; \n"+
+ " case X x:\n"+
+ " System.out.println(\"X\"); \n"+
+ " System.out.println(x);\n"+
+ " break;\n"+
+ " default : System.out.println(\"Object\"); \n"+
+ " }\n"+
+ " } \n"+
+ " public static void main(String[] args) {\n"+
+ " foo(\"Hello World!\");\n"+
+ " foo(\"H\");\n"+
+ " foo(bar());\n"+
+ " }\n"+
+ " public static Object bar() { return new Object();}\n"+
+ "}",
+ },
+ "String s && s.length()>1\n" +
+ "Hello World!\n" +
+ "String\n" +
+ "H\n" +
+ "Object");
+ }
+ public void testBug573939_03b() {
+ this.runConformTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " private static void foo(Object o) {\n"+
+ " switch (o) {\n"+
+ " case Integer I: \n"+
+ " System.out.println(\"Integer\"); \n"+
+ " System.out.println(I); \n"+
+ " break; \n"+
+ " case String s && s.length()>1: \n"+
+ " System.out.println(\"String s && s.length()>1\"); \n"+
+ " System.out.println(s); \n"+
+ " break;\n"+
+ " case String s: \n"+
+ " System.out.println(\"String\"); \n"+
+ " System.out.println(s);\n"+
+ " break; \n"+
+ " case X x:\n"+
+ " System.out.println(\"X\"); \n"+
+ " System.out.println(x);\n"+
+ " break;\n"+
+ " default : System.out.println(\"Object\"); \n"+
+ " }\n"+
+ " } \n"+
+ " public static void main(String[] args) {\n"+
+ " foo(\"Hello World!\");\n"+
+ " foo(\"H\");\n"+
+ " foo(bar());\n"+
+ " }\n"+
+ " public static Object bar() { return new Object();}\n"+
+ "}",
+ },
+ "String s && s.length()>1\n" +
+ "Hello World!\n" +
+ "String\n" +
+ "H\n" +
+ "Object");
+ }
+ public void test045() {
+ this.runNegativeTest(
+ new String[] {
+ "X.java",
+ "public abstract class X {\n" +
+ " public static void main(String[] args) {\n" +
+ " switch (args.length) {\n" +
+ " case 1:\n" +
+ " final int j = 1;\n" +
+ " case 2:\n" +
+ " switch (5) {\n" +
+ " case j:\n" +
+ " }\n" +
+ " }\n" +
+ " }\n" +
+ "}\n",
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 8)\n" +
+ " case j:\n" +
+ " ^\n" +
+ "The local variable j may not have been initialized\n" +
+ "----------\n");
+ }
+ public void testBug574525_01() {
+ this.runConformTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " private static void foo(Object o) {\n"+
+ " switch (o) {\n"+
+ " case Integer I: \n"+
+ " System.out.println(\"Integer\"); \n"+
+ " System.out.println(I); \n"+
+ " break; \n"+
+ " case null:\n"+
+ " System.out.println(\"NULL\"); \n"+
+ " break;\n"+
+ " default : System.out.println(\"Object\"); \n"+
+ " }\n"+
+ " } \n"+
+ " public static void main(String[] args) {\n"+
+ " foo(null);\n"+
+ " }\n"+
+ "}",
+ },
+ "NULL");
+ }
+ public void testBug574525_02() {
+ this.runConformTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " private static void foo(Object o) {\n"+
+ " switch (o) {\n"+
+ " case Integer I: \n"+
+ " System.out.println(\"Integer\"); \n"+
+ " System.out.println(I); \n"+
+ " break; \n"+
+ " case String s && s.length()>1: \n"+
+ " System.out.println(\"String s && s.length()>1\"); \n"+
+ " System.out.println(s); \n"+
+ " break;\n"+
+ " case String s1: \n"+
+ " System.out.println(\"String\"); \n"+
+ " System.out.println(s1);\n"+
+ " break; \n"+
+ " case X x:\n"+
+ " System.out.println(\"X\"); \n"+
+ " System.out.println(x);\n"+
+ " break;\n"+
+ " case null:\n"+
+ " System.out.println(\"NULL\"); \n"+
+ " break;\n"+
+ " default : System.out.println(\"Object\"); \n"+
+ " }\n"+
+ " } \n"+
+ " public static void main(String[] args) {\n"+
+ " foo(\"Hello World!\");\n"+
+ " foo(null);\n"+
+ " foo(bar());\n"+
+ " }\n"+
+ " public static Object bar() { return new Object();}\n"+
+ "}",
+ },
+ "String s && s.length()>1\n" +
+ "Hello World!\n" +
+ "NULL\n" +
+ "Object");
+ }
+ public void testBug574525_03() {
+ this.runConformTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " private static void foo(Integer o) {\n"+
+ " switch (o) {\n"+
+ " case 10: \n"+
+ " System.out.println(\"Integer\"); \n"+
+ " System.out.println(o); \n"+
+ " break; \n"+
+ " case null:\n"+
+ " System.out.println(\"NULL\"); \n"+
+ " break;\n"+
+ " default : System.out.println(o); \n"+
+ " }\n"+
+ " } \n"+
+ " public static void main(String[] args) {\n"+
+ " foo(0);\n"+
+ " }\n"+
+ "}",
+ },
+ "0");
+ }
+ public void testBug574525_04() {
+ this.runNegativeTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " private static void foo(int o) {\n"+
+ " switch (o) {\n"+
+ " case 10: \n"+
+ " System.out.println(\"Integer\"); \n"+
+ " System.out.println(o); \n"+
+ " break; \n"+
+ " case null:\n"+
+ " System.out.println(\"NULL\"); \n"+
+ " break;\n"+
+ " default : System.out.println(o); \n"+
+ " }\n"+
+ " } \n"+
+ " public static void main(String[] args) {\n"+
+ " foo(0);\n"+
+ " }\n"+
+ "}",
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 8)\n" +
+ " case null:\n" +
+ " ^^^^\n" +
+ "Type mismatch: cannot convert from null to int\n" +
+ "----------\n");
+ }
+ public void testBug574538_01() {
+ this.runConformTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " public static void main(String[] args) {\n"+
+ " foo(Integer.valueOf(11));\n"+
+ " foo(Integer.valueOf(9));\n"+
+ " }\n"+
+ "\n"+
+ " private static void foo(Object o) {\n"+
+ " switch (o) {\n"+
+ " case Integer i && i>10:\n"+
+ " System.out.println(\"Greater than 10:\" + o);\n"+
+ " break;\n"+
+ " case Integer j && j>0:\n"+
+ " System.out.println(\"Greater than 0:\" + o);\n"+
+ " break;\n"+
+ " default:\n"+
+ " System.out.println(\"Object\" + o);\n"+
+ " }\n"+
+ " }\n"+
+ "}",
+ },
+ "Greater than 10:11\n" +
+ "Greater than 0:9");
+ }
+ public void testBug574538_02() {
+ this.runConformTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " public static void main(String[] args) {\n"+
+ " foo1(Integer.valueOf(10));\n"+
+ " foo1(Integer.valueOf(11));\n"+
+ " foo1(\"Hello World!\");\n"+
+ " }\n"+
+ "\n"+
+ " private static void foo1(Object o) {\n"+
+ " switch (o) {\n"+
+ " case Integer i&&i>10 -> System.out.println(\"Greater than 10:\");\n"+
+ " case String s&&s.equals(\"ff\") -> System.out.println(\"String:\" + s);\n"+
+ " default -> System.out.println(\"Object:\" + o);\n"+
+ " }\n"+
+ " }\n"+
+ "}",
+ },
+ "Object:10\n" +
+ "Greater than 10:\n" +
+ "Object:Hello World!");
+ }
+
+ public void testBug574549_01() {
+ this.runConformTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " public static void main(String[] args) {\n"+
+ " foo(\"Hello World!\");\n"+
+ " }\n"+
+ "\n"+
+ " private static void foo(Object o) {\n"+
+ " switch (o) {\n"+
+ " case default:\n"+
+ " System.out.println(\"Object: \" + o);\n"+
+ " }\n"+
+ " }\n"+
+ "}",
+ },
+ "Object: Hello World!");
+ }
+ public void testBug574549_02() {
+ this.runConformTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " public static void main(String[] args) {\n"+
+ " foo(Integer.valueOf(11));\n"+
+ " foo(Integer.valueOf(9));\n"+
+ " foo(\"Hello World!\");\n"+
+ " }\n"+
+ "\n"+
+ " private static void foo(Object o) {\n"+
+ " switch (o) {\n"+
+ " case Integer i && i>10:\n"+
+ " System.out.println(\"Greater than 10:\" + o);\n"+
+ " break;\n"+
+ " case Integer j && j>0:\n"+
+ " System.out.println(\"Greater than 0:\" + o);\n"+
+ " break;\n"+
+ " case default:\n"+
+ " System.out.println(\"Give Me Some SunShine:\" + o);\n"+
+ " }\n"+
+ " }\n"+
+ "}",
+ },
+ "Greater than 10:11\n" +
+ "Greater than 0:9\n" +
+ "Give Me Some SunShine:Hello World!");
+ }
+ public void testBug574549_03() {
+ this.runNegativeTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " public static void main(String[] args) {\n"+
+ " foo(\"Hello World!\");\n"+
+ " }\n"+
+ "\n"+
+ " private static void foo(Object o) {\n"+
+ " switch (o) {\n"+
+ " case Integer i :\n"+
+ " System.out.println(\"Integer:\" + o);\n"+
+ " break;\n"+
+ " case default:\n"+
+ " System.out.println(\"Object\" + o);\n"+
+ " case default:\n"+
+ " System.out.println(\"Give me Some Sunshine\" + o);\n"+
+ " }\n"+
+ " }\n"+
+ "}",
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 13)\n" +
+ " case default:\n" +
+ " ^^^^^^^^^^^^\n" +
+ "The default case is already defined\n" +
+ "----------\n");
+ }
+ public void testBug574549_04() {
+ this.runNegativeTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " public static void main(String[] args) {\n"+
+ " foo(\"Hello World!\");\n"+
+ " }\n"+
+ "\n"+
+ " private static void foo(Object o) {\n"+
+ " switch (o) {\n"+
+ " case Integer i :\n"+
+ " System.out.println(\"Integer:\" + o);\n"+
+ " break;\n"+
+ " case default:\n"+
+ " System.out.println(\"Object\" + o);\n"+
+ " default:\n"+
+ " System.out.println(\"Give me Some Sunshine\" + o);\n"+
+ " }\n"+
+ " }\n"+
+ "}",
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 13)\n" +
+ " default:\n" +
+ " ^^^^^^^\n" +
+ "The default case is already defined\n" +
+ "----------\n");
+ }
+ // Test that when a pattern variable is unused and when the OPTION_PreserveUnusedLocal
+ // option is used, no issue is reported at runtime.
+ public void testBug573937_1() {
+ Map<String,String> options = getCompilerOptions();
+ String opt = options.get(CompilerOptions.OPTION_PreserveUnusedLocal);
+ try {
+ options.put(CompilerOptions.OPTION_PreserveUnusedLocal, CompilerOptions.DISABLED);
+ this.runConformTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"
+ + " public static void main(String[] args) {\n"
+ + " System.out.println(\"Hello\");\n"
+ + " }\n"
+ + " public static void foo(Object o) {\n"
+ + " switch (o) {\n"
+ + " case String s:\n"
+ + " break;\n"
+ + " default:\n"
+ + " break;\n"
+ + " }\n"
+ + " }\n"
+ + "}",
+ },
+ "Hello",
+ options);
+ } finally {
+ options.put(CompilerOptions.OPTION_PreserveUnusedLocal, opt);
+ }
+ }
+ // A simple pattern variable in a case is not visible in the
+ // following case statement
+ public void testBug573937_2() {
+ this.runNegativeTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"
+ + " public static void foo(Object o) {\n"
+ + " switch (o) {\n"
+ + " case String s:\n"
+ + " System.out.println(s);\n"
+ + " break;\n"
+ + " case Integer i:\n"
+ + " System.out.println(s);\n"
+ + " default:\n"
+ + " break;\n"
+ + " }\n"
+ + " }\n"
+ + "}",
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 8)\n" +
+ " System.out.println(s);\n" +
+ " ^\n" +
+ "s cannot be resolved to a variable\n" +
+ "----------\n");
+ }
+ // Same as above, but without break statement
+ public void testBug573937_3() {
+ this.runNegativeTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"
+ + " public static void foo(Object o) {\n"
+ + " switch (o) {\n"
+ + " case String s:\n"
+ + " System.out.println(s);\n"
+ + " case Integer i:\n"
+ + " System.out.println(s);\n"
+ + " default:\n"
+ + " System.out.println(s);\n"
+ + " break;\n"
+ + " }\n"
+ + " }\n"
+ + "}",
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 7)\n" +
+ " System.out.println(s);\n" +
+ " ^\n" +
+ "s cannot be resolved to a variable\n" +
+ "----------\n" +
+ "2. ERROR in X.java (at line 9)\n" +
+ " System.out.println(s);\n" +
+ " ^\n" +
+ "s cannot be resolved to a variable\n" +
+ "----------\n");
+ }
+ // Test that compiler rejects attempts to redeclare local variable
+ // with same name as a pattern variable
+ public void testBug573937_4() {
+ this.runNegativeTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"
+ + " public static void foo(Object o) {\n"
+ + " switch (o) {\n"
+ + " case String s:\n"
+ + " String s = null;\n"
+ + " System.out.println(s);\n"
+ + " break;\n"
+ + " default:\n"
+ + " break;\n"
+ + " }\n"
+ + " }\n"
+ + "}",
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 5)\n" +
+ " String s = null;\n" +
+ " ^\n" +
+ "Duplicate local variable s\n" +
+ "----------\n");
+ }
+ // Test that compiler allows local variable with same name as a
+ // pattern variable in a different case statement
+ public void testBug573937_5() {
+ this.runConformTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"
+ + " public static void foo(Object o) {\n"
+ + " switch (o) {\n"
+ + " case String s:\n"
+ + " System.out.println(s);\n"
+ + " break;\n"
+ + " default:\n"
+ + " String s = null;\n"
+ + " break;\n"
+ + " }\n"
+ + " }\n"
+ + " public static void main(String[] args) {\n"
+ + " foo(\"hello\");\n"
+ + " }\n"
+ + "}",
+ },
+ "hello");
+ }
+ // Test that a pattern variable can't use name of an already existing local
+ // variable
+ public void testBug573937_6() {
+ this.runNegativeTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"
+ + " public static void foo(Object o) {\n"
+ + " switch (o) {\n"
+ + " case String o:\n"
+ + " System.out.println(o);\n"
+ + " break;\n"
+ + " default:\n"
+ + " break;\n"
+ + " }\n"
+ + " }\n"
+ + "}",
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 4)\n" +
+ " case String o:\n" +
+ " ^\n" +
+ "Duplicate local variable o\n" +
+ "----------\n");
+ }
+ // Test that compiler rejects attempts to redeclare another pattern
+ // variable (instanceof) with same name as that a pattern variable in
+ // that case statement
+ public void testBug573937_7() {
+ this.runNegativeTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"
+ + " public static void foo(Object o) {\n"
+ + " switch (o) {\n"
+ + " case String s1:\n"
+ + " if (o instanceof String s1) {\n"
+ + " System.out.println(s1);\n"
+ + " }\n"
+ + " break;\n"
+ + " default:\n"
+ + " break;\n"
+ + " }\n"
+ + " }\n"
+ + "} ",
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 5)\n" +
+ " if (o instanceof String s1) {\n" +
+ " ^^\n" +
+ "Duplicate local variable s1\n" +
+ "----------\n");
+ }
+ // Test that when multiple case statements declare pattern variables
+ // with same name, correct ones are used in their respective scopes.
+ public void testBug573937_8() {
+ this.runNegativeTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"
+ + " public static void foo(Object o) {\n"
+ + " switch (o) {\n"
+ + " case String s1:\n"
+ + " System.out.println(s1.length());\n"
+ + " break;\n"
+ + " case Integer s1:\n"
+ + " System.out.println(s1.length());\n"
+ + " break;\n"
+ + " default:\n"
+ + " break;\n"
+ + " }\n"
+ + " }\n"
+ + "} ",
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 8)\n" +
+ " System.out.println(s1.length());\n" +
+ " ^^^^^^\n" +
+ "The method length() is undefined for the type Integer\n" +
+ "----------\n");
+ }
+ // Test that a pattern variable declared in the preceding case statement
+ // can't be used in the case statement itself
+ public void testBug573937_9() {
+ this.runNegativeTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"
+ + " public static void foo(Object o) {\n"
+ + " switch (o) {\n"
+ + " case Integer i1:\n"
+ + " break;\n"
+ + " case String s1 && s1.length() > i1:\n"
+ + " System.out.println(s1.length());\n"
+ + " break;\n"
+ + " default:\n"
+ + " break;\n"
+ + " }\n"
+ + " }\n"
+ + "} ",
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 6)\n" +
+ " case String s1 && s1.length() > i1:\n" +
+ " ^^\n" +
+ "i1 cannot be resolved to a variable\n" +
+ "----------\n");
+ }
+ // Test that redefining pattern variables with null is allowed
+ // and produce expected result (NPE) when run.
+ public void testBug573937_10() {
+ Runner runner = new Runner();
+ runner.testFiles = new String[] {
+ "X.java",
+ "public class X {\n"
+ + "@SuppressWarnings(\"null\")"
+ + " public static void foo(Object o) {\n"
+ + " try {\n"
+ + " switch (o) {\n"
+ + " case String s1 && s1.length() == 0:\n"
+ + " break;"
+ + " case String s1:\n"
+ + " s1 = null;\n"
+ + " System.out.println(s1.length());\n"
+ + " break;\n"
+ + " default:\n"
+ + " break;\n"
+ + " }\n"
+ + " } catch(Exception e) {\n"
+ + " System.out.println(e.getMessage());\n"
+ + " };\n"
+ + " }\n"
+ + " public static void main(String[] args) {\n"
+ + " foo(\"hello\");\n"
+ + " }\n"
+ + "}",
+ };
+ runner.expectedOutputString = "Cannot invoke \"String.length()\" because \"s1\" is null";
+ runner.expectedJavacOutputString = "Cannot invoke \"String.length()\" because \"<local4>\" is null";
+ runner.vmArguments = new String[] {"--enable-preview"};
+ runner.customOptions = getCompilerOptions();
+ runner.javacTestOptions = JavacTestOptions.forReleaseWithPreview(SwitchPatternTest.previewLevel);
+ runner.runConformTest();
+ }
+ // Test that a pattern variable is allowed in a switch label throw
+ // statement and when run, produces expected result
+ public void testBug573937_11() {
+ Runner runner = new Runner();
+ runner.testFiles = new String[] {
+ "X.java",
+ "public class X {\n"
+ + " public static void foo(Object o) throws Exception {\n"
+ + " switch (o) {\n"
+ + " case String s1:\n"
+ + " throw new Exception(s1);\n"
+ + " default:\n"
+ + " break;\n"
+ + " }\n"
+ + " }\n"
+ + " public static void main(String[] args) throws Exception {\n"
+ + " try {\n"
+ + " foo(\"hello\");\n"
+ + " } catch(Exception e) {\n"
+ + " e.printStackTrace(System.out);\n"
+ + " };\n"
+ + " }\n"
+ + "} ",
+ };
+ runner.expectedOutputString = "java.lang.Exception: hello\n" +
+ " at X.foo(X.java:5)\n" +
+ " at X.main(X.java:12)";
+ runner.expectedJavacOutputString = "java.lang.Exception: hello\n"
+ + " at X.foo(X.java:5)\n"
+ + " at X.main(X.java:12)";
+ runner.vmArguments = new String[] {"--enable-preview"};
+ runner.customOptions = getCompilerOptions();
+ runner.javacTestOptions = JavacTestOptions.forReleaseWithPreview(SwitchPatternTest.previewLevel);
+ runner.runConformTest();
+ }
+ // A non effectively final referenced from the RHS of the guarding expression
+ // is reported by the compiler.
+ public void testBug574612_1() {
+ this.runNegativeTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"
+ + " public static void foo(Object o) {\n"
+ + " int len = 2;\n"
+ + " switch (o) {\n"
+ + " case String o1 && o1.length() > len:\n"
+ + " len = 0;\n"
+ + " break;\n"
+ + " default:\n"
+ + " break;\n"
+ + " }\n"
+ + " }\n"
+ + "} ",
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 5)\n" +
+ " case String o1 && o1.length() > len:\n" +
+ " ^^^\n" +
+ "Local variable len referenced from a guard must be final or effectively final\n" +
+ "----------\n");
+ }
+ // A non effectively final referenced from the LHS of the guarding expression
+ // is reported by the compiler.
+ public void testBug574612_2() {
+ this.runNegativeTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"
+ + " public static void foo(Object o) {\n"
+ + " int len = 2;\n"
+ + " switch (o) {\n"
+ + " case String o1 && len < o1.length():\n"
+ + " len = 0;\n"
+ + " break;\n"
+ + " default:\n"
+ + " break;\n"
+ + " }\n"
+ + " }\n"
+ + "} ",
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 5)\n" +
+ " case String o1 && len < o1.length():\n" +
+ " ^^^\n" +
+ "Local variable len referenced from a guard must be final or effectively final\n" +
+ "----------\n");
+ }
+ // An explicitly final local variable, also referenced in a guarding expression of a pattern
+ // and later on re-assigned is only reported for the explicit final being modified
+ public void testBug574612_3() {
+ this.runNegativeTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"
+ + " public static void foo(Object o) {\n"
+ + " final int len = 2;\n"
+ + " switch (o) {\n"
+ + " case String o1 && len < o1.length():\n"
+ + " len = 0;\n"
+ + " break;\n"
+ + " default:\n"
+ + " break;\n"
+ + " }\n"
+ + " }\n"
+ + "} ",
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 6)\n" +
+ " len = 0;\n" +
+ " ^^^\n" +
+ "The final local variable len cannot be assigned. It must be blank and not using a compound assignment\n" +
+ "----------\n");
+ }
+ public void testBug574612_4() {
+ this.runConformTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"
+ + " public static void foo(Object o) {\n"
+ + " int len = 2;\n"
+ + " switch (o) {\n"
+ + " case String o1 && len < o1.length():\n"
+ + " System.out.println(o1);\n"
+ + " break;\n"
+ + " default:\n"
+ + " break;\n"
+ + " }\n"
+ + " }\n"
+ + " public static void main(String[] args) throws Exception {\n"
+ + " foo(\"hello\");\n"
+ + " }\n"
+ + "} ",
+ },
+ "hello");
+ }
+ public void testBug574719_001() {
+ runConformTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " public static int foo(Integer o) {\n"+
+ " int k = 0;\n"+
+ " switch (o) {\n"+
+ " case 0, default : k = 1;\n"+
+ " }\n"+
+ " return k;\n"+
+ " } \n"+
+ " public static void main(String[] args) {\n"+
+ " System.out.println(foo(100 ));\n"+
+ " }\n"+
+ "}",
+ },
+ "1");
+ }
+ public void testBug574719_002() {
+ runConformTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " public static int foo(Integer o) {\n"+
+ " int k = 0;\n"+
+ " switch (o) {\n"+
+ " case 0, default, 1 : k = 1;\n"+
+ " }\n"+
+ " return k;\n"+
+ " } \n"+
+ " public static void main(String[] args) {\n"+
+ " System.out.println(foo(100 ));\n"+
+ " }\n"+
+ "}",
+ },
+ "1");
+ }
+ public void testBug574719_003() {
+ runConformTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " public static int foo(Integer o) {\n"+
+ " int k = 0;\n"+
+ " switch (o) {\n"+
+ " case default, 1 : k = 1;\n"+
+ " }\n"+
+ " return k;\n"+
+ " } \n"+
+ " public static void main(String[] args) {\n"+
+ " System.out.println(foo(100));\n"+
+ " System.out.println(foo(0));\n"+
+ " }\n"+
+ "}",
+ },
+ "1\n" +
+ "1");
+ }
+ public void testBug574719_004() {
+ runConformTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " public static int foo(Integer o) {\n"+
+ " int k = 0;\n"+
+ " switch (o) {\n"+
+ " case 0 : k = 2; break;\n"+
+ " case default, 1 : k = 1;\n"+
+ " }\n"+
+ " return k;\n"+
+ " } \n"+
+ " public static void main(String[] args) {\n"+
+ " System.out.println(foo(100));\n"+
+ " System.out.println(foo(0));\n"+
+ " }\n"+
+ "}",
+ },
+ "1\n" +
+ "2");
+ }
+ public void testBug574719_005() {
+ runConformTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " public static int foo(Integer o) {\n"+
+ " int k = 0;\n"+
+ " switch (o) {\n"+
+ " case 0 : k = 2; break;\n"+
+ " case 1, default : k = 1;\n"+
+ " }\n"+
+ " return k;\n"+
+ " } \n"+
+ " public static void main(String[] args) {\n"+
+ " System.out.println(foo(100));\n"+
+ " System.out.println(foo(0));\n"+
+ " }\n"+
+ "}",
+ },
+ "1\n" +
+ "2");
+ }
+ public void testBug574719_006() {
+ runNegativeTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " public static int foo(Integer o) {\n"+
+ " int k = 0;\n"+
+ " switch (o) {\n"+
+ " case 0 : k = 2; break;\n"+
+ " case 1, default, default : k = 1;\n"+
+ " }\n"+
+ " return k;\n"+
+ " } \n"+
+ " public static void main(String[] args) {\n"+
+ " System.out.println(foo(100));\n"+
+ " System.out.println(foo(0));\n"+
+ " }\n"+
+ "}",
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 6)\n" +
+ " case 1, default, default : k = 1;\n" +
+ " ^^^^^^^\n" +
+ "The default case is already defined\n" +
+ "----------\n");
+ }
+ public void testBug574719_007() {
+ runConformTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " public static int foo(Integer o) {\n"+
+ " int k = 0;\n"+
+ " switch (o) {\n"+
+ " case 10, default: k = 1;break;\n"+
+ " case 0 : k = 2; break;\n"+
+ " }\n"+
+ " return k;\n"+
+ " } \n"+
+ " public static void main(String[] args) {\n"+
+ " System.out.println(foo(100));\n"+
+ " System.out.println(foo(0));\n"+
+ " System.out.println(foo(10));\n"+
+ " }\n"+
+ "}",
+ },
+ "1\n"+
+ "2\n"+
+ "1");
+ }
+ public void testBug574561_001() {
+ runNegativeTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " public static int foo(Integer o) {\n"+
+ " int k = 0;\n"+
+ " switch (o) {\n"+
+ " default, default : k = 2; break;\n"+
+ " }\n"+
+ " return k;\n"+
+ " } \n"+
+ " public static void main(String[] args) {\n"+
+ " System.out.println(foo(100));\n"+
+ " System.out.println(foo(0));\n"+
+ " }\n"+
+ "}",
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 5)\n" +
+ " default, default : k = 2; break;\n" +
+ " ^\n" +
+ "Syntax error on token \",\", : expected\n" +
+ "----------\n");
+ }
+ public void testBug574561_002() {
+ runNegativeTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " public static int foo(Integer o) {\n"+
+ " int k = 0;\n"+
+ " switch (o) {\n"+
+ " case default, 1, default : k = 1;\n"+
+ " }\n"+
+ " return k;\n"+
+ " } \n"+
+ " public static void main(String[] args) {\n"+
+ " System.out.println(foo(100));\n"+
+ " System.out.println(foo(0));\n"+
+ " }\n"+
+ "}",
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 5)\n" +
+ " case default, 1, default : k = 1;\n" +
+ " ^^^^^^^\n" +
+ "The default case is already defined\n" +
+ "----------\n");
+ }
+ public void testBug574561_003() {
+ runNegativeTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " public static int foo(Integer o) {\n"+
+ " int k = 0;\n"+
+ " switch (o) {\n"+
+ " case default, 1, default : k = 1;\n"+
+ " }\n"+
+ " return k;\n"+
+ " } \n"+
+ " public static void main(String[] args) {\n"+
+ " System.out.println(foo(100));\n"+
+ " System.out.println(foo(0));\n"+
+ " }\n"+
+ "}",
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 5)\n" +
+ " case default, 1, default : k = 1;\n" +
+ " ^^^^^^^\n" +
+ "The default case is already defined\n" +
+ "----------\n");
+ }
+ public void testBug574793_001() {
+ runNegativeTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " public static void main(String[] args) {}\n"+
+ " private static void foo1(int o) {\n"+
+ " switch (o) {\n"+
+ " case null -> System.out.println(\"null\");\n"+
+ " case 20 -> System.out.println(\"20\");\n"+
+ " }\n"+
+ " }\n"+
+ " private static void foo(Object o) {\n"+
+ " switch (o) {\n"+
+ " case \"F\" :\n"+
+ " break;\n"+
+ " case 2 :\n"+
+ " break;\n"+
+ " default:\n"+
+ " break;\n"+
+ " }\n"+
+ " }\n"+
+ "}",
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 4)\n" +
+ " switch (o) {\n" +
+ " ^\n" +
+ "An enhanced switch statement should be exhaustive; a default label expected\n" +
+ "----------\n" +
+ "2. ERROR in X.java (at line 5)\n" +
+ " case null -> System.out.println(\"null\");\n" +
+ " ^^^^\n" +
+ "Type mismatch: cannot convert from null to int\n" +
+ "----------\n" +
+ "3. ERROR in X.java (at line 11)\n" +
+ " case \"F\" :\n" +
+ " ^^^\n" +
+ "Type mismatch: cannot convert from String to Object\n" +
+ "----------\n" +
+ "4. ERROR in X.java (at line 13)\n" +
+ " case 2 :\n" +
+ " ^\n" +
+ "Type mismatch: cannot convert from int to Object\n" +
+ "----------\n");
+ }
+ public void testBug574559_001() {
+ runNegativeTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " public static void main(String[] args) {}\n"+
+ " public static void foo1(Integer o) {\n"+
+ " switch (o) {\n"+
+ " case 1, Integer i -> System.out.println(o);\n"+
+ " }\n"+
+ " }\n"+
+ "}",
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 5)\n" +
+ " case 1, Integer i -> System.out.println(o);\n" +
+ " ^^^^^^^^^\n" +
+ "Illegal fall-through to a pattern\n" +
+ "----------\n");
+ }
+ public void testBug574559_002() {
+ runNegativeTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " public static void main(String[] args) {}\n"+
+ " private static void foo1(Integer o) {\n"+
+ " switch (o) {\n"+
+ " case Integer i, 30 -> System.out.println(o);\n"+
+ " }\n"+
+ " }\n"+
+ "}",
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 5)\n" +
+ " case Integer i, 30 -> System.out.println(o);\n" +
+ " ^^\n" +
+ "This case label is dominated by one of the preceding case label\n" +
+ "----------\n");
+ }
+ // Test that fall-through to a pattern is not allowed (label statement group has one statement)
+ public void testBug573940_1() {
+ runNegativeTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ "public void foo(Number n) {\n"
+ + " switch (n) {\n"
+ + " case Integer i :\n"
+ + " System.out.println(i);\n"
+ + " case Float f :\n"
+ + " System.out.println(f);\n"
+ + " case Object o : break;\n"
+ + " }\n"
+ + "}\n"+
+ "}",
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 6)\n" +
+ " case Float f :\n" +
+ " ^^^^^^^^^^^^\n" +
+ "Illegal fall-through to a pattern\n" +
+ "----------\n" +
+ "2. ERROR in X.java (at line 8)\n" +
+ " case Object o : break;\n" +
+ " ^^^^^^^^^^^^^\n" +
+ "Illegal fall-through to a pattern\n" +
+ "----------\n");
+ }
+ // Test that fall-through to a pattern is not allowed (label statement group has zero statement)
+ public void testBug573940_2() {
+ runNegativeTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ "public void foo(Number n) {\n"
+ + " switch (n) {\n"
+ + " case Integer i :\n"
+ + " case Float f :\n"
+ + " System.out.println(f);\n"
+ + " break;\n"
+ + " default : break;\n"
+ + " }\n"
+ + "}\n"+
+ "}",
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 5)\n" +
+ " case Float f :\n" +
+ " ^^^^^^^^^^^^\n" +
+ "Illegal fall-through to a pattern\n" +
+ "----------\n");
+ }
+ // Test that fall-through to a pattern is not allowed (label statement group has zero statement)
+ public void testBug573940_2a() {
+ runNegativeTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ "public void foo(Number n) {\n"
+ + " switch (n) {\n"
+ + " default :\n"
+ + " case Float f :\n"
+ + " System.out.println(f);\n"
+ + " break;\n"
+ + " }\n"
+ + "}\n"+
+ "}",
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 5)\n" +
+ " case Float f :\n" +
+ " ^^^^^^^^^^^^\n" +
+ "Illegal fall-through to a pattern\n" +
+ "----------\n");
+ }
+ // Test that falling through from a pattern to a default is allowed
+ public void testBug573940_3() {
+ runConformTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"
+ + "public static void foo(Number n) {\n"
+ + " switch (n) {\n"
+ + " case Integer i :\n"
+ + " System.out.println(i);\n"
+ + " default:\n"
+ + " System.out.println(\"null\");\n"
+ + " }\n"
+ + " }\n"
+ + "public static void main(String[] args) {\n"
+ + " foo(Integer.valueOf(5));\n"
+ + " }\n"
+ + "}",
+ },
+ "5\n" +
+ "null");
+ }
+ // Test that a case statement with pattern is allowed when statement group ends
+ // with an Throw statement instead of a break statement
+ public void testBug573940_4() {
+ runConformTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"
+ + "public static void foo(Number n) {\n"
+ + " switch (n) {\n"
+ + " case Integer i :\n"
+ + " throw new IllegalArgumentException();\n"
+ + " default:\n"
+ + " System.out.println(\"null\");\n"
+ + " }\n"
+ + " }\n"
+ + "public static void main(String[] args) {\n"
+ + " try{\n"
+ + " foo(Integer.valueOf(5));\n"
+ + " } catch(Exception e) {\n"
+ + " e.printStackTrace(System.out);\n"
+ + " }\n"
+ + " }\n"
+ + "}",
+ },
+ "java.lang.IllegalArgumentException\n" +
+ " at X.foo(X.java:5)\n" +
+ " at X.main(X.java:12)");
+ }
+ // Test that switch expression with pattern variables is reported when a case statement
+ // doesn't return any value.
+ public void testBug573940_5() {
+ runNegativeTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"
+ + " public static void foo(Number n) {\n"
+ + " int j = \n"
+ + " switch (n) {\n"
+ + " case Integer i -> {\n"
+ + " }\n"
+ + " default -> {\n"
+ + " yield 1;\n"
+ + " }\n"
+ + " };\n"
+ + " }\n"
+ + "}",
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 6)\n" +
+ " }\n" +
+ " ^^\n" +
+ "A switch labeled block in a switch expression should not complete normally\n" +
+ "----------\n");
+ }
+ public void testBug574564_001() {
+ runNegativeTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " public static void main(String[] args) {\n"+
+ " foo(new String(\"Hello\"));\n"+
+ " }\n"+
+ " private static void foo(Object o) {\n"+
+ " switch (o) {\n"+
+ " case var i -> System.out.println(0);\n"+
+ " default -> System.out.println(o);\n"+
+ " }\n"+
+ " }\n"+
+ "}",
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 7)\n" +
+ " case var i -> System.out.println(0);\n" +
+ " ^^^\n" +
+ "'var' is not allowed here\n" +
+ "----------\n");
+ }
+ public void testBug574564_002() {
+ runNegativeTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " public static void main(String[] args) {\n"+
+ " foo(new String(\"Hello\"));\n"+
+ " }\n"+
+ " private static void foo(Object o) {\n"+
+ " switch (o) {\n"+
+ " case var i, var j, var k -> System.out.println(0);\n"+
+ " default -> System.out.println(o);\n"+
+ " }\n"+
+ " }\n"+
+ "}",
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 7)\n" +
+ " case var i, var j, var k -> System.out.println(0);\n" +
+ " ^^^\n" +
+ "\'var\' is not allowed here\n" +
+ "----------\n" +
+ "2. ERROR in X.java (at line 7)\n" +
+ " case var i, var j, var k -> System.out.println(0);\n" +
+ " ^^^\n" +
+ "\'var\' is not allowed here\n" +
+ "----------\n" +
+ "3. ERROR in X.java (at line 7)\n" +
+ " case var i, var j, var k -> System.out.println(0);\n" +
+ " ^^^^^\n" +
+ "A switch label may not have more than one pattern case label element\n" +
+ "----------\n" +
+ "4. ERROR in X.java (at line 7)\n" +
+ " case var i, var j, var k -> System.out.println(0);\n" +
+ " ^^^\n" +
+ "\'var\' is not allowed here\n" +
+ "----------\n");
+ }
+ public void testBug574564_003() {
+ runNegativeTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " public static void main(String[] args) {\n"+
+ " foo(10);\n"+
+ " }\n"+
+ " private static void foo(Integer o) {\n"+
+ " switch (o) {\n"+
+ " case var i, 10 -> System.out.println(0);\n"+
+ " default -> System.out.println(o);\n"+
+ " }\n"+
+ " }\n"+
+ "}",
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 7)\n" +
+ " case var i, 10 -> System.out.println(0);\n" +
+ " ^^^\n" +
+ "\'var\' is not allowed here\n" +
+ "----------\n");
+ }
+ public void testBug574564_004() {
+ runNegativeTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " public static void main(String[] args) {\n"+
+ " foo(10);\n"+
+ " }\n"+
+ " private static void foo(Integer o) {\n"+
+ " switch (o) {\n"+
+ " case var i, 10, var k -> System.out.println(0);\n"+
+ " default -> System.out.println(o);\n"+
+ " }\n"+
+ " }\n"+
+ "}",
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 7)\n" +
+ " case var i, 10, var k -> System.out.println(0);\n" +
+ " ^^^\n" +
+ "\'var\' is not allowed here\n" +
+ "----------\n" +
+ "3. ERROR in X.java (at line 7)\n" +
+ " case var i, 10, var k -> System.out.println(0);\n" +
+ " ^^^\n" +
+ "\'var\' is not allowed here\n" +
+ "----------\n" +
+ "4. ERROR in X.java (at line 7)\n" +
+ " case var i, 10, var k -> System.out.println(0);\n" +
+ " ^^^^^\n" +
+ "A switch label may not have more than one pattern case label element\n" +
+ "----------\n");
+ }
+ public void testBug574564_005() {
+ runNegativeTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " public static void main(String[] args) {\n"+
+ " foo(10);\n"+
+ " }\n"+
+ " private static void foo(Integer o) {\n"+
+ " switch (o) {\n"+
+ " case 10, null, var k -> System.out.println(0);\n"+
+ " default -> System.out.println(o);\n"+
+ " }\n"+
+ " }\n"+
+ "}",
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 7)\n" +
+ " case 10, null, var k -> System.out.println(0);\n" +
+ " ^^^\n" +
+ "\'var\' is not allowed here\n" +
+ "----------\n");
+ }
+ public void testBug574564_006() {
+ runNegativeTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " public static void main(String[] args) {\n"+
+ " foo(10);\n"+
+ " }\n"+
+ " private static void foo(Integer o) {\n"+
+ " switch (o) {\n"+
+ " case default, var k -> System.out.println(0);\n"+
+ " default -> System.out.println(o);\n"+
+ " }\n"+
+ " }\n"+
+ "}",
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 7)\n" +
+ " case default, var k -> System.out.println(0);\n" +
+ " ^^^\n" +
+ "\'var\' is not allowed here\n" +
+ "----------\n" +
+ "2. ERROR in X.java (at line 7)\n" +
+ " case default, var k -> System.out.println(0);\n" +
+ " ^^^^^\n" +
+ "A switch label may not have both a pattern case label element and a default case label element\n" +
+ "----------\n" +
+ "3. ERROR in X.java (at line 8)\n" +
+ " default -> System.out.println(o);\n" +
+ " ^^^^^^^\n" +
+ "The default case is already defined\n" +
+ "----------\n");
+ }
+ public void testBug574564_007() {
+ runNegativeTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " public static void main(String[] args) {\n"+
+ " foo(10);\n"+
+ " }\n"+
+ " private static void foo(Integer o) {\n"+
+ " switch (o) {\n"+
+ " case default, default, var k -> System.out.println(0);\n"+
+ " default -> System.out.println(o);\n"+
+ " }\n"+
+ " }\n"+
+ "}",
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 7)\n" +
+ " case default, default, var k -> System.out.println(0);\n" +
+ " ^^^^^^^\n" +
+ "The default case is already defined\n" +
+ "----------\n" +
+ "2. ERROR in X.java (at line 7)\n" +
+ " case default, default, var k -> System.out.println(0);\n" +
+ " ^^^\n" +
+ "\'var\' is not allowed here\n" +
+ "----------\n" +
+ "3. ERROR in X.java (at line 7)\n" +
+ " case default, default, var k -> System.out.println(0);\n" +
+ " ^^^^^\n" +
+ "A switch label may not have both a pattern case label element and a default case label element\n" +
+ "----------\n" +
+ "4. ERROR in X.java (at line 8)\n" +
+ " default -> System.out.println(o);\n" +
+ " ^^^^^^^\n" +
+ "The default case is already defined\n" +
+ "----------\n");
+ }
+ public void testBug574564_008() {
+ runNegativeTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " public static void main(String[] args) {\n"+
+ " foo(10);\n"+
+ " }\n"+
+ " private static void foo(Integer o) {\n"+
+ " switch (o) {\n"+
+ " case default, 1, var k -> System.out.println(0);\n"+
+ " default -> System.out.println(o);\n"+
+ " }\n"+
+ " }\n"+
+ "}",
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 7)\n" +
+ " case default, 1, var k -> System.out.println(0);\n" +
+ " ^^^\n" +
+ "\'var\' is not allowed here\n" +
+ "----------\n" +
+ "3. ERROR in X.java (at line 7)\n" +
+ " case default, 1, var k -> System.out.println(0);\n" +
+ " ^^^^^\n" +
+ "A switch label may not have both a pattern case label element and a default case label element\n" +
+ "----------\n" +
+ "5. ERROR in X.java (at line 8)\n" +
+ " default -> System.out.println(o);\n" +
+ " ^^^^^^^\n" +
+ "The default case is already defined\n" +
+ "----------\n");
+ }
+ public void testBug574564_009() {
+ runNegativeTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " private static void foo(Object o) {\n"+
+ " switch (o) {\n"+
+ " case String s, default, Integer i -> System.out.println(0);\n"+
+ " }\n"+
+ " }\n"+
+ "}",
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 4)\n" +
+ " case String s, default, Integer i -> System.out.println(0);\n" +
+ " ^^^^^^^\n" +
+ "A switch label may not have both a pattern case label element and a default case label element\n" +
+ "----------\n" +
+ "2. ERROR in X.java (at line 4)\n" +
+ " case String s, default, Integer i -> System.out.println(0);\n" +
+ " ^^^^^^^^^\n" +
+ "A switch label may not have more than one pattern case label element\n" +
+ "----------\n");
+ }
+ public void testBug574564_010() {
+ Map<String, String> options = getCompilerOptions();
+ options.put(CompilerOptions.OPTION_EnablePreviews, CompilerOptions.DISABLED);
+ runNegativeTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " private static void foo(Object o) {\n"+
+ " switch (o) {\n"+
+ " case String s, default, Integer i -> System.out.println(0);\n"+
+ " }\n"+
+ " }\n"+
+ "}",
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 4)\n" +
+ " case String s, default, Integer i -> System.out.println(0);\n" +
+ " ^\n" +
+ "Syntax error on token \"s\", delete this token\n" +
+ "----------\n" +
+ "2. ERROR in X.java (at line 4)\n" +
+ " case String s, default, Integer i -> System.out.println(0);\n" +
+ " ^\n" +
+ "Syntax error on token \"i\", delete this token\n" +
+ "----------\n",
+ null,
+ true,
+ options);
+ }
+ public void testBug574564_011() {
+ Map<String, String> options = getCompilerOptions();
+ options.put(CompilerOptions.OPTION_EnablePreviews, CompilerOptions.DISABLED);
+ runNegativeTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " private static void foo(Integer o) {\n"+
+ " switch (o) {\n"+
+ " case null -> System.out.println(0);\n"+
+ " }\n"+
+ " }\n"+
+ "}",
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 4)\n" +
+ " case null -> System.out.println(0);\n" +
+ " ^^^^\n" +
+ "Pattern Matching in Switch is a preview feature and disabled by default. Use --enable-preview to enable\n" +
+ "----------\n",
+ null,
+ true,
+ options);
+ }
+ public void testBug574564_012() {
+ Map<String, String> options = getCompilerOptions();
+ options.put(CompilerOptions.OPTION_EnablePreviews, CompilerOptions.DISABLED);
+ runNegativeTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " private static void foo(Integer o) {\n"+
+ " switch (o) {\n"+
+ " case 1, default, null -> System.out.println(0);\n"+
+ " }\n"+
+ " }\n"+
+ "}",
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 4)\n" +
+ " case 1, default, null -> System.out.println(0);\n" +
+ " ^^^^^^^\n" +
+ "Pattern Matching in Switch is a preview feature and disabled by default. Use --enable-preview to enable\n" +
+ "----------\n" +
+ "2. ERROR in X.java (at line 4)\n" +
+ " case 1, default, null -> System.out.println(0);\n" +
+ " ^^^^\n" +
+ "Pattern Matching in Switch is a preview feature and disabled by default. Use --enable-preview to enable\n" +
+ "----------\n",
+ null,
+ true,
+ options);
+ }
+ public void testBug574564_013() {
+ runNegativeTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " private static void foo(Object o) {\n"+
+ " switch (o) {\n"+
+ " case default, default -> System.out.println(0);\n"+
+ " }\n"+
+ " }\n"+
+ "}",
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 4)\n" +
+ " case default, default -> System.out.println(0);\n" +
+ " ^^^^^^^\n" +
+ "The default case is already defined\n" +
+ "----------\n");
+ }
+ public void testBug574563_001() {
+ runNegativeTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " public static void main(String[] args) {}\n"+
+ " private static void foo1(Integer o) {\n"+
+ " switch (o) {\n"+
+ " case null, null -> System.out.println(o);\n"+
+ " default -> System.out.println(o);\n"+
+ " }\n"+
+ " }\n"+
+ "}",
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 5)\n" +
+ " case null, null -> System.out.println(o);\n" +
+ " ^^^^^^^^^^^^^^^\n" +
+ "Duplicate case\n" +
+ "----------\n");
+ }
+ public void testBug574563_002() {
+ runNegativeTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " private static void foo(Object o) {\n"+
+ " switch (o) {\n"+
+ " case null, Integer i -> System.out.println(0);\n"+
+ " default -> System.out.println(o);\n"+
+ " }\n"+
+ " Zork();\n"+
+ " }\n"+
+ "}",
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 7)\n" +
+ " Zork();\n" +
+ " ^^^^\n" +
+ "The method Zork() is undefined for the type X\n" +
+ "----------\n");
+ }
+ public void testBug574563_003() {
+ runNegativeTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " private static void foo(Object o) {\n"+
+ " switch (o) {\n"+
+ " case Integer i, null -> System.out.println(0);\n"+
+ " default -> System.out.println(o);\n"+
+ " }\n"+
+ " Zork();\n"+
+ " }\n"+
+ "}",
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 7)\n" +
+ " Zork();\n" +
+ " ^^^^\n" +
+ "The method Zork() is undefined for the type X\n" +
+ "----------\n");
+ }
+ public void testBug574563_004() {
+ runNegativeTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " private static void foo(Object o) {\n"+
+ " switch (o) {\n"+
+ " case null, Integer i && i > 10 -> System.out.println(0);\n"+
+ " default -> System.out.println(o);\n"+
+ " }\n"+
+ " Zork();\n"+
+ " }\n"+
+ "}",
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 4)\n" +
+ " case null, Integer i && i > 10 -> System.out.println(0);\n" +
+ " ^^^^^^^^^^^^^^^^^^^\n" +
+ "A null case label and patterns can co-exist only if the pattern is a type pattern\n" +
+ "----------\n" +
+ "2. ERROR in X.java (at line 7)\n" +
+ " Zork();\n" +
+ " ^^^^\n" +
+ "The method Zork() is undefined for the type X\n" +
+ "----------\n");
+ }
+ public void testBug574563_005() {
+ runNegativeTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " private static void foo(Object o) {\n"+
+ " switch (o) {\n"+
+ " case Integer i && i > 10, null -> System.out.println(0);\n"+
+ " default -> System.out.println(o);\n"+
+ " }\n"+
+ " Zork();\n"+
+ " }\n"+
+ "}",
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 4)\n" +
+ " case Integer i && i > 10, null -> System.out.println(0);\n" +
+ " ^^^^\n" +
+ "A null case label and patterns can co-exist only if the pattern is a type pattern\n" +
+ "----------\n" +
+ "2. ERROR in X.java (at line 7)\n" +
+ " Zork();\n" +
+ " ^^^^\n" +
+ "The method Zork() is undefined for the type X\n" +
+ "----------\n");
+ }
+ public void testBug575030_01() {
+ this.runConformTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " public static void main(String[] args) {\n"+
+ " foo(\"Hello World!\");\n"+
+ " }\n"+
+ "\n"+
+ " private static void foo(String o) {\n"+
+ " switch (o) {\n"+
+ " case String s -> System.out.println(s);\n"+
+ " }\n"+
+ " }\n"+
+ "}",
+ },
+ "Hello World!");
+ }
+ public void testBug574614_001() {
+ runConformTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " public static void main(String[] args) {\n"+
+ " foo(Long.valueOf(10));\n"+
+ " }\n"+
+ " private static void foo(Object o) {\n"+
+ " String s1 = \" Hello \";\n"+
+ " String s2 = \"World!\";\n"+
+ " switch (o) {\n"+
+ " case Integer I && I > 10: break;\n"+
+ " case X J: break;\n"+
+ " case String s : break;\n"+
+ " default:\n"+
+ " s1 = new StringBuilder(String.valueOf(s1)).append(String.valueOf(s2)).toString();\n"+
+ " System.out.println(s1);\n"+
+ " break; \n"+
+ " }\n"+
+ " }\n"+
+ "}",
+ },
+ "Hello World!");
+ }
+ public void testBug574614_002() {
+ runConformTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " public static void main(String[] args) {\n"+
+ " foo(Long.valueOf(0));\n"+
+ " }\n"+
+ " private static void foo(Object o) {\n"+
+ " switch (o) {\n"+
+ " case Integer I:\n"+
+ " break;\n"+
+ " case String s :\n"+
+ " break;\n"+
+ " case X J:\n"+
+ " break;\n"+
+ " default:\n"+
+ " String s1 = \"Hello \";\n"+
+ " String s2 = \"World!\";\n"+
+ " s1 = s1 +s2; \n"+
+ " System.out.println(s1);\n"+
+ " break;\n"+
+ " }\n"+
+ " } \n"+
+ "}",
+ },
+ "Hello World!");
+ }
+ public void testBug573921_1() {
+ runNegativeTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " private static void foo(Object o) {\n"+
+ " switch(o) {\n" +
+ " case CharSequence cs ->\n" +
+ " System.out.println(\"A sequence of length \" + cs.length());\n" +
+ " case String s && s.length() > 0 -> \n" +
+ " System.out.println(\"A string: \" + s);\n" +
+ " default -> {\n" +
+ " break;\n" +
+ " } \n" +
+ " }\n"+
+ " }\n"+
+ "}",
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 6)\n" +
+ " case String s && s.length() > 0 -> \n" +
+ " ^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
+ "This case label is dominated by one of the preceding case label\n" +
+ "----------\n");
+ }
+ public void testBug573921_2() {
+ runNegativeTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " private static void foo(Object o) {\n"+
+ " switch(o) {\n" +
+ " case CharSequence cs:\n" +
+ " System.out.println(\"A sequence of length \" + cs.length());\n" +
+ " break;\n" +
+ " case String s:\n" +
+ " System.out.println(\"A string: \" + s);\n" +
+ " break;\n" +
+ " default: \n" +
+ " break;\n" +
+ " }\n"+
+ " }\n"+
+ "}",
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 7)\n" +
+ " case String s:\n" +
+ " ^^^^^^^^\n" +
+ "This case label is dominated by one of the preceding case label\n" +
+ "----------\n");
+ }
+ public void testBug573921_3() {
+ runConformTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " public static void main(String[] args) {\n"+
+ " foo(\"Hello!\");\n"+
+ " }\n"+
+ " private static void foo(Object o) {\n"+
+ " switch(o) {\n" +
+ " case String s:\n" +
+ " System.out.println(\"String:\" + s);\n" +
+ " break;\n" +
+ " case CharSequence cs:\n" +
+ " System.out.println(\"A CS:\" + cs);\n" +
+ " break;\n" +
+ " default: \n" +
+ " break;\n" +
+ " }\n"+
+ " }\n"+
+ "}",
+ },
+ "String:Hello!");
+ }
+ public void testBug573921_4() {
+ runConformTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " public static void main(String[] args) {\n"+
+ " foo(new StringBuffer(\"Hello!\"));\n"+
+ " }\n"+
+ " private static void foo(Object o) {\n"+
+ " switch(o) {\n" +
+ " case String s:\n" +
+ " System.out.println(\"String:\" + s);\n" +
+ " break;\n" +
+ " case CharSequence cs:\n" +
+ " System.out.println(\"A CS:\" + cs.toString());\n" +
+ " break;\n" +
+ " default: \n" +
+ " break;\n" +
+ " }\n"+
+ " }\n"+
+ "}",
+ },
+ "A CS:Hello!");
+ }
+ public void testBug573921_5() {
+ runConformTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " public static void main(String[] args) {\n"+
+ " foo(\"Hello\");\n"+
+ " }\n"+
+ " private static void foo(Object o) {\n"+
+ " switch(o) {\n" +
+ " case String s && s.length() < 5 :\n" +
+ " System.out.println(\"1:\" + s);\n" +
+ " break;\n" +
+ " case String s && s.length() == 5:\n" +
+ " System.out.println(\"2:\" + s);\n" +
+ " break;\n" +
+ " default : System.out.println(\"Object\");\n" +
+ " }\n"+
+ " }\n"+
+ "}",
+ },
+ "2:Hello");
+ }
+ public void testBug573921_6() {
+ runConformTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " public static void main(String[] args) {\n"+
+ " foo(\"\");\n"+
+ " }\n"+
+ " private static void foo(Object o) {\n"+
+ " switch(o) {\n" +
+ " case String s && s.length() < 5 :\n" +
+ " System.out.println(\"1:\" + s);\n" +
+ " break;\n" +
+ " case String s && s.length() == 5:\n" +
+ " System.out.println(\"2:\" + s);\n" +
+ " break;\n" +
+ " default : System.out.println(\"Object\");\n" +
+ " }\n"+
+ " }\n"+
+ "}",
+ },
+ "1:");
+ }
+ public void testBug573921_7() {
+ runNegativeTest(
+ new String[] {
+ "X.java",
+ "import java.util.*;\n" +
+ "public class X {\n"+
+ " @SuppressWarnings(\"rawtypes\")\n" +
+ " private static void foo(Object o) {\n"+
+ " switch(o) {\n"+
+ " case List cs:\n"+
+ " System.out.println(\"A sequence of length \" + cs.size());\n"+
+ " break;\n"+
+ " case List<String> s: \n"+
+ " System.out.println(\"A string: \" + s);\n"+
+ " break;\n"+
+ " } "+
+ " }\n"+
+ "}",
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 5)\n" +
+ " switch(o) {\n" +
+ " ^\n" +
+ "An enhanced switch statement should be exhaustive; a default label expected\n" +
+ "----------\n" +
+ "2. ERROR in X.java (at line 9)\n" +
+ " case List<String> s: \n" +
+ " ^^^^^^^^^^^^^^\n" +
+ "Type Object cannot be safely cast to List<String>\n" +
+ "----------\n" +
+ "3. ERROR in X.java (at line 9)\n" +
+ " case List<String> s: \n" +
+ " ^^^^^^^^^^^^^^\n" +
+ "This case label is dominated by one of the preceding case label\n" +
+ "----------\n");
+ }
+ public void testBug573921_8() {
+ runNegativeTest(
+ new String[] {
+ "X.java",
+ "import java.util.*;\n" +
+ "public class X {\n"+
+ " @SuppressWarnings(\"rawtypes\")\n" +
+ " private static void foo(Object o) {\n"+
+ " switch(o.hashCode()) {\n"+
+ " case String s:\n"+
+ " break;\n"+
+ " default: \n"+
+ " break;\n"+
+ " } "+
+ " }\n"+
+ "}",
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 6)\n" +
+ " case String s:\n" +
+ " ^^^^^^^^\n" +
+ "Type mismatch: cannot convert from int to String\n" +
+ "----------\n");
+ }
+ public void testBug573921_9() {
+ runNegativeTest(
+ new String[] {
+ "X.java",
+ "import java.util.*;\n" +
+ "public class X {\n"+
+ " @SuppressWarnings(\"rawtypes\")\n" +
+ " private static void foo(Object o) {\n"+
+ " switch(o) {\n"+
+ " case Object o1:\n"+
+ " break;\n"+
+ " default: \n"+
+ " break;\n"+
+ " } "+
+ " }\n"+
+ "}",
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 8)\n" +
+ " default: \n" +
+ " ^^^^^^^\n" +
+ "Switch case cannot have both a total pattern and default label\n" +
+ "----------\n");
+ }
+ public void testBug573921_10() {
+ runNegativeTest(
+ new String[] {
+ "X.java",
+ "import java.util.*;\n" +
+ "public class X {\n"+
+ " @SuppressWarnings(\"rawtypes\")\n" +
+ " private static void foo(List<String> o) {\n"+
+ " switch(o) {\n"+
+ " case List o1:\n"+
+ " break;\n"+
+ " default: \n"+
+ " break;\n"+
+ " } "+
+ " }\n"+
+ "}",
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 8)\n" +
+ " default: \n" +
+ " ^^^^^^^\n" +
+ "Switch case cannot have both a total pattern and default label\n" +
+ "----------\n");
+ }
+ public void testBug573921_11() {
+ runNegativeTest(
+ new String[] {
+ "X.java",
+ "import java.util.*;\n" +
+ "public class X {\n"+
+ " @SuppressWarnings(\"rawtypes\")\n" +
+ " private static void foo(String s) {\n"+
+ " switch(s) {\n"+
+ " case CharSequence cs:\n"+
+ " break;\n"+
+ " default: \n"+
+ " break;\n"+
+ " } "+
+ " }\n"+
+ "}",
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 8)\n" +
+ " default: \n" +
+ " ^^^^^^^\n" +
+ "Switch case cannot have both a total pattern and default label\n" +
+ "----------\n");
+ }
+ public void testBug575049_001() {
+ runConformTest(
+ new String[] {
+ "X.java",
+ "sealed interface I permits A,B,C {}\n"+
+ "final class A implements I {}\n"+
+ "final class B implements I {}\n"+
+ "record C(int j) implements I {} // Implicitly final\n"+
+ "public class X {\n"+
+ " static int testSealedCoverage(I i) {\n"+
+ " return switch (i) {\n"+
+ " case A a -> 0;\n"+
+ " case B b -> 1;\n"+
+ " case C c -> 2; // No default required!\n"+
+ " default -> 3;\n"+
+ " };\n"+
+ " }\n"+
+ " public static void main(String[] args) {\n"+
+ " A a = new A();\n"+
+ " System.out.println(testSealedCoverage(a));\n"+
+ " }\n"+
+ "}",
+ },
+ "0");
+ }
+ public void testBug575049_002() {
+ runConformTest(
+ new String[] {
+ "X.java",
+ "sealed interface I permits A,B,C {}\n"+
+ "final class A implements I {}\n"+
+ "final class B implements I {}\n"+
+ "record C(int j) implements I {} // Implicitly final\n"+
+ "public class X {\n"+
+ " static int testSealedCoverage(I i) {\n"+
+ " return switch (i) {\n"+
+ " case A a -> 0;\n"+
+ " case B b -> 1;\n"+
+ " case C c -> 2; // No default required!\n"+
+ " };\n"+
+ " }\n"+
+ " public static void main(String[] args) {\n"+
+ " A a = new A();\n"+
+ " System.out.println(testSealedCoverage(a));\n"+
+ " }\n"+
+ "}",
+ },
+ "0");
+ }
+ public void testBug575049_003() {
+ runConformTest(
+ new String[] {
+ "X.java",
+ "sealed interface I permits A,B,C {}\n"+
+ "final class A implements I {}\n"+
+ "final class B implements I {}\n"+
+ "record C(int j) implements I {} // Implicitly final\n"+
+ "public class X {\n"+
+ " static int testSealedCoverage(I i) {\n"+
+ " return switch (i) {\n"+
+ " case A a -> 0;\n"+
+ " case B b -> 1;\n"+
+ " default -> 2; // No default required!\n"+
+ " };\n"+
+ " }\n"+
+ " public static void main(String[] args) {\n"+
+ " A a = new A();\n"+
+ " System.out.println(testSealedCoverage(a));\n"+
+ " }\n"+
+ "}",
+ },
+ "0");
+ }
+ public void testBug575049_004() {
+ runNegativeTest(
+ new String[] {
+ "X.java",
+ "sealed interface I permits A,B,C {}\n"+
+ "final class A implements I {}\n"+
+ "final class B implements I {}\n"+
+ "record C(int j) implements I {} // Implicitly final\n"+
+ "public class X {\n"+
+ " static int testSealedCoverage(I i) {\n"+
+ " return switch (i) {\n"+
+ " case A a -> 0;\n"+
+ " case B b -> 1;\n"+
+ " };\n"+
+ " }\n"+
+ " public static void main(String[] args) {\n"+
+ " A a = new A();\n"+
+ " System.out.println(testSealedCoverage(a));\n"+
+ " }\n"+
+ "}",
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 7)\n" +
+ " return switch (i) {\n" +
+ " ^\n" +
+ "A switch expression should have a default case\n" +
+ "----------\n");
+ }
+ public void testBug575048_01() {
+ runNegativeTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " static int foo(Integer i) {\n"+
+ " return switch (i) {\n"+
+ " default -> 2;\n"+
+ " case Integer i1 -> 0;\n"+
+ " };\n"+
+ " }\n"+
+ " public static void main(String[] args) {\n"+
+ " System.out.println(foo(1));\n"+
+ " }\n"+
+ "}",
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 5)\n" +
+ " case Integer i1 -> 0;\n" +
+ " ^^^^^^^^^^^^^^^\n" +
+ "Switch case cannot have both a total pattern and default label\n" +
+ "----------\n");
+ }
+ public void testBug575053_001() {
+ runConformTest(
+ new String[] {
+ "X.java",
+ "public class X {\n" +
+ " public void foo(String o) {\n" +
+ " switch (o) {\n" +
+ " case String s && s.length() > 0 -> {}\n" +
+ " default -> {}\n" +
+ " } \n" +
+ " }\n" +
+ " public static void main(String[] args) {\n" +
+ " try{\n" +
+ " (new X()).foo(null);\n" +
+ " } catch(Exception e) {\n" +
+ " e.printStackTrace(System.out);\n" +
+ " }\n" +
+ " }\n"+
+ "}",
+ },
+ "java.lang.NullPointerException\n" +
+ " at java.base/java.util.Objects.requireNonNull(Objects.java:208)\n" +
+ " at X.foo(X.java:3)\n" +
+ " at X.main(X.java:10)");
+ }
+ public void testBug575053_002() {
+ runConformTest(
+ new String[] {
+ "X.java",
+ "public class X {\n" +
+ " public void foo(Object o) {\n" +
+ " switch (o) {\n" +
+ " case String s -> {}\n" +
+ " default -> {}\n" +
+ " } \n" +
+ " }\n" +
+ " public static void main(String[] args) {\n" +
+ " try{\n" +
+ " (new X()).foo(null);\n" +
+ " } catch(Exception t) {\n" +
+ " t.printStackTrace();\n" +
+ " }\n" +
+ " }\n"+
+ "}",
+ },
+ "",
+ "java.lang.NullPointerException\n" +
+ " at java.base/java.util.Objects.requireNonNull(Objects.java:208)\n" +
+ " at X.foo(X.java:3)\n" +
+ " at X.main(X.java:10)");
+ }
+ public void testBug575249_01() {
+ runConformTest(
+ new String[] {
+ "X.java",
+ "public class X {\n" +
+ " public static int foo(Object o) {\n" +
+ " return switch (o) {\n" +
+ " case (String s) : yield 0;\n" +
+ " default : yield 1;\n" +
+ " };\n" +
+ " }\n" +
+ " public static void main(String[] args) {\n" +
+ " System.out.println(foo(\"Hello\"));\n" +
+ " }\n"+
+ "}",
+ },
+ "0");
+ }
+ public void testBug575249_02() {
+ runConformTest(
+ new String[] {
+ "X.java",
+ "public class X {\n" +
+ " public static int foo(Object o) {\n" +
+ " return switch (o) {\n" +
+ " case (String s && s.length() < 10) : yield 0;\n" +
+ " default : yield 1;\n" +
+ " };\n" +
+ " }\n" +
+ " public static void main(String[] args) {\n" +
+ " System.out.println(foo(\"Hello\"));\n" +
+ " }\n"+
+ "}",
+ },
+ "0");
+ }
+ public void testBug575249_03() {
+ runConformTest(
+ new String[] {
+ "X.java",
+ "public class X {\n" +
+ " public static int foo(Object o) {\n" +
+ " return switch (o) {\n" +
+ " case (String s) -> 0;\n" +
+ " default -> 1;\n" +
+ " };\n" +
+ " }\n" +
+ " public static void main(String[] args) {\n" +
+ " System.out.println(foo(\"Hello\"));\n" +
+ " }\n"+
+ "}",
+ },
+ "0");
+ }
+ public void testBug575249_04() {
+ runConformTest(
+ new String[] {
+ "X.java",
+ "public class X {\n" +
+ " public static int foo(Object o) {\n" +
+ " return switch (o) {\n" +
+ " case (String s && s.length() < 10) -> 0;\n" +
+ " default -> 1;\n" +
+ " };\n" +
+ " }\n" +
+ " public static void main(String[] args) {\n" +
+ " System.out.println(foo(\"Hello\"));\n" +
+ " }\n"+
+ "}",
+ },
+ "0");
+ }
+ public void testBug575241_01() {
+ runConformTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " static int foo(Integer i) {\n"+
+ " return switch (i) {\n"+
+ " case Integer i1 -> 0;\n"+
+ " };\n"+
+ " }\n"+
+ " public static void main(String[] args) {\n"+
+ " System.out.println(foo(1));\n"+
+ " }\n"+
+ "}",
+ },
+ "0");
+ }
+ public void testBug575241_02() {
+ runConformTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " static int foo(Integer i) {\n"+
+ " return switch (i) {\n"+
+ " case Object o -> 0;\n"+
+ " };\n"+
+ " }\n"+
+ " public static void main(String[] args) {\n"+
+ " System.out.println(foo(1));\n"+
+ " }\n"+
+ "}",
+ },
+ "0");
+ }
+ public void testBug575241_03() {
+ runConformTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " static int foo(Object myVar) {\n"+
+ " return switch (myVar) {\n"+
+ " case null -> 0;\n"+
+ " case Integer o -> 1;\n"+
+ " case Object obj ->2;\n"+
+ " };\n"+
+ " }\n"+
+ " public static void main(String[] args) {\n"+
+ " System.out.println(foo(Integer.valueOf(0)));\n"+
+ " System.out.println(foo(null));\n"+
+ " }\n"+
+ "}",
+ },
+ "1\n" +
+ "0");
+ }
+ public void testBug575241_04() {
+ runConformTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " static int foo(Object myVar) {\n"+
+ " return switch (myVar) {\n"+
+ " case Integer o -> 1;\n"+
+ " case Object obj ->2;\n"+
+ " };\n"+
+ " }\n"+
+ " public static void main(String[] args) {\n"+
+ " System.out.println(foo(Integer.valueOf(0)));\n"+
+ " System.out.println(foo(null));\n"+
+ " }\n"+
+ "}",
+ },
+ "1\n" +
+ "2");
+ }
+ public void testBug575241_05() {
+ runConformTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " static void foo(Integer myVar) {\n"+
+ " switch (myVar) {\n"+
+ " case null -> System.out.println(100);\n"+
+ " case Integer o -> System.out.println(o);\n"+
+ " };\n"+
+ " }\n"+
+ " public static void main(String[] args) {\n"+
+ " foo(Integer.valueOf(0));\n"+
+ " foo(null);\n"+
+ " }\n"+
+ "}",
+ },
+ "0\n" +
+ "100");
+ }
+ public void testBug575241_06() {
+ runConformTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " static void foo(Integer myVar) {\n"+
+ " switch (myVar) {\n"+
+ " case Integer o -> System.out.println(o);\n"+
+ " };\n"+
+ " }\n"+
+ " public static void main(String[] args) {\n"+
+ " foo(Integer.valueOf(0));\n"+
+ " foo(null);\n"+
+ " }\n"+
+ "}",
+ },
+ "0\n" +
+ "null");
+ }
+ public void testBug575241_07() {
+ runConformTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " static void foo(String myVar) {\n"+
+ " switch (myVar) {\n"+
+ " case null -> System.out.println(100);\n"+
+ " case String o -> System.out.println(o);\n"+
+ " };\n"+
+ " }\n"+
+ " public static void main(String[] args) {\n"+
+ " foo(\"Hello\");\n"+
+ " foo(null);\n"+
+ " }\n"+
+ "}",
+ },
+ "Hello\n" +
+ "100");
+ }
+ public void testBug575241_08() {
+ runConformTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " static void foo(String myVar) {\n"+
+ " switch (myVar) {\n"+
+ " case String o -> System.out.println(o);\n"+
+ " };\n"+
+ " }\n"+
+ " public static void main(String[] args) {\n"+
+ " foo(\"Hello\");\n"+
+ " foo(null);\n"+
+ " }\n"+
+ "}",
+ },
+ "Hello\n" +
+ "null");
+ }
+ public void testBug575356_01() {
+ this.runConformTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " static void foo(Integer myVar) {\n"+
+ " switch (myVar) {\n"+
+ " case default -> System.out.println(\"hello\");\n"+
+ " }; \n"+
+ " } \n"+
+ "\n"+
+ " public static void main(String[] args) {\n"+
+ " foo(Integer.valueOf(10)); \n"+
+ " } \n"+
+ "}",
+ },
+ "hello");
+ }
+ public void testBug575356_02() {
+ this.runConformTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " static void foo(Integer myVar) {\n"+
+ " switch (myVar) {\n"+
+ " case null, default -> System.out.println(\"hello\");\n"+
+ " }; \n"+
+ " } \n"+
+ "\n"+
+ " public static void main(String[] args) {\n"+
+ " foo(Integer.valueOf(10)); \n"+
+ " } \n"+
+ "}",
+ },
+ "hello");
+ }
+ public void testBug575356_03() {
+ this.runConformTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " static void foo(Integer myVar) {\n"+
+ " switch (myVar) {\n"+
+ " case default, null -> System.out.println(\"hello\");\n"+
+ " }; \n"+
+ " } \n"+
+ "\n"+
+ " public static void main(String[] args) {\n"+
+ " foo(Integer.valueOf(10)); \n"+
+ " } \n"+
+ "}",
+ },
+ "hello");
+ }
+ public void testBug575356_04() {
+ this.runConformTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ "private static void foo(Object o) {\n"+
+ " switch (o) {\n"+
+ " case Integer i ->\n"+
+ " System.out.println(\"Integer:\"+ i );\n"+
+ " case default -> System.out.println(o.toString() );\n"+
+ " }\n"+
+ "}\n"+
+ "\n"+
+ " public static void main(String[] args) {\n"+
+ " foo(Integer.valueOf(10)); \n"+
+ " foo(new String(\"Hello\")); \n"+
+ " } \n"+
+ "}",
+ },
+ "Integer:10\n" +
+ "Hello");
+ }
+ public void testBug575052_001() {
+ runConformTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " static void foo(Object o) {\n"+
+ " switch (o) {\n"+
+ " case String s -> System.out.println(s);\n"+
+ " default -> System.out.println(0);\n"+
+ " };\n"+
+ " }\n"+
+ " public static void main(String[] args) {\n"+
+ " foo(\"Hello\");\n"+
+ " }\n"+
+ "}",
+ },
+ "Hello");
+ }
+ public void testBug575052_002() {
+ runNegativeTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " static void foo(Object o) {\n"+
+ " switch (o) {\n"+
+ " case String s -> System.out.println(s);\n"+
+ " };\n"+
+ " }\n"+
+ " public static void main(String[] args) {\n"+
+ " foo(\"Hello\");\n"+
+ " }\n"+
+ "}",
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 3)\n" +
+ " switch (o) {\n" +
+ " ^\n" +
+ "An enhanced switch statement should be exhaustive; a default label expected\n" +
+ "----------\n");
+ }
+ public void testBug575052_003() {
+ runNegativeTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " static int foo(Object o) {\n"+
+ " switch (o) {\n"+
+ " case null -> System.out.println(0);\n"+
+ " };\n"+
+ " }\n"+
+ " public static void main(String[] args) {\n"+
+ " foo(\"Hello\");\n"+
+ " }\n"+
+ "}",
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 3)\n" +
+ " switch (o) {\n" +
+ " ^\n" +
+ "An enhanced switch statement should be exhaustive; a default label expected\n" +
+ "----------\n");
+ }
+ public void testBug575052_004() {
+ runConformTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " private static int foo(int i) {\n"+
+ " switch (i) {\n"+
+ " case 1:\n"+
+ " break;\n"+
+ " }\n"+
+ " return 0;\n"+
+ " }\n"+
+ " public static void main(String[] args) {\n"+
+ " System.out.println(X.foo(0));\n"+
+ " }\n"+
+ "}",
+ },
+ "0");
+ }
+ public void testBug575050_001() {
+ runNegativeTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " static int foo(Object o) {\n"+
+ " return switch (o) {\n"+
+ " case String s -> 0;\n"+
+ " };\n"+
+ " }\n"+
+ " public static void main(String[] args) {\n"+
+ " foo(\"Hello\");\n"+
+ " }\n"+
+ "}",
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 3)\n" +
+ " return switch (o) {\n" +
+ " ^\n" +
+ "A switch expression should have a default case\n" +
+ "----------\n");
+ }
+ public void testBug575050_002() {
+ runNegativeTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " static int foo(Object o) {\n"+
+ " return switch (o) {\n"+
+ " case null -> 0;\n"+
+ " };\n"+
+ " }\n"+
+ " public static void main(String[] args) {\n"+
+ " foo(\"Hello\");\n"+
+ " }\n"+
+ "}",
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 3)\n" +
+ " return switch (o) {\n" +
+ " ^\n" +
+ "A switch expression should have a default case\n" +
+ "----------\n");
+ }
+ // From 14.11.1: A switch label that has a pattern case label element p that is
+ // total for the type of the selector expression of the enclosing
+ // switch statement or switch expression dominates a switch label that has
+ // a null case label element.
+ public void testBug575047_01() {
+ runNegativeTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " static int foo(Integer i) {\n"+
+ " return switch (i) {\n"+
+ " case Integer i1 -> 0;\n"+
+ " case null -> 2;\n"+
+ " };\n"+
+ " }\n"+
+ "}",
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 5)\n" +
+ " case null -> 2;\n" +
+ " ^^^^\n" +
+ "This case label is dominated by one of the preceding case label\n" +
+ "----------\n");
+ }
+ // A switch label that has a pattern case label element p dominates another
+ // switch label that has a constant case label element c if either of the
+ // following is true:
+ // * the type of c is a primitive type and its wrapper class (5.1.7) is a subtype of the erasure of the type of p.
+ // * the type of c is a reference type and is a subtype of the erasure of the type of p.
+ public void testBug575047_02() {
+ runNegativeTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " static int foo(Integer i) {\n"+
+ " return switch (i) {\n"+
+ " case Integer i1 -> i1;\n"+
+ " case 0 -> 0;\n"+
+ " };\n"+
+ " }\n"+
+ "}",
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 5)\n" +
+ " case 0 -> 0;\n" +
+ " ^\n" +
+ "This case label is dominated by one of the preceding case label\n" +
+ "----------\n");
+ }
+ public void testBug575047_03() {
+ runNegativeTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " static void foo(Color c) {\n"+
+ " switch (c) {\n" +
+ " case Color c1 : \n" +
+ " break;\n" +
+ " case Blue :\n" +
+ " break;\n" +
+ " }\n"+
+ " }\n"+
+ "enum Color { Blue, Red; }\n" +
+ "}",
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 6)\n" +
+ " case Blue :\n" +
+ " ^^^^\n" +
+ "This case label is dominated by one of the preceding case label\n" +
+ "----------\n");
+ }
+ public void testBug575047_04() {
+ runConformTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " static int foo(Integer i) {\n"+
+ " return switch (i) {\n"+
+ " case null -> 2;\n"+
+ " case Integer i1 -> 0;\n"+
+ " };\n"+
+ " }\n"+
+ " public static void main(String[] args) {\n"+
+ " System.out.println(foo(null));\n"+
+ " System.out.println(foo(Integer.valueOf(0)));\n"+
+ " }\n"+
+ "}",
+ },
+ "2\n" +
+ "0");
+ }
+ public void testBug575047_05() {
+ runNegativeTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " static void foo(float c) {\n"+
+ " switch (c) {\n" +
+ " case 0 : \n" +
+ " break;\n" +
+ " default :\n" +
+ " }\n"+
+ " }\n"+
+ "}",
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 4)\n" +
+ " case 0 : \n" +
+ " ^\n" +
+ "Type mismatch: cannot convert from int to float\n" +
+ "----------\n");
+ }
+ public void testBug575047_06() {
+ runNegativeTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " static int foo(String o) {\n"+
+ " return switch (o) {\n" +
+ " case String s && s.length() > 0 -> 3;\n" +
+ " case String s1 -> 1;\n" +
+ " case String s -> -1;\n"+
+ " };\n"+
+ " }\n"+
+ "}",
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 6)\n" +
+ " case String s -> -1;\n" +
+ " ^^^^^^^^\n" +
+ "The switch statement cannot have more than one total pattern\n" +
+ "----------\n" +
+ "2. ERROR in X.java (at line 6)\n" +
+ " case String s -> -1;\n" +
+ " ^^^^^^^^\n" +
+ "This case label is dominated by one of the preceding case label\n" +
+ "----------\n");
+ }
+ // Test that when a literal is used as case constant
+ // we report type mismatch error against the literal's type and
+ // not on other types the case statement may have resolved too
+ public void testBug575047_07() {
+ runNegativeTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " static void foo(Number i) {\n"+
+ " switch (i) {\n"+
+ " case Integer j, \"\":\n"+
+ " System.out.println(0);\n"+
+ " default:\n"+
+ " }\n"+
+ " }\n"+
+ "}",
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 4)\n" +
+ " case Integer j, \"\":\n" +
+ " ^^\n" +
+ "Type mismatch: cannot convert from String to Number\n" +
+ "----------\n");
+ }
+ public void testBug575047_08() {
+ runConformTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " static int foo(Integer i) {\n"+
+ " return switch (i) {\n"+
+ " case 0 -> 0;\n"+
+ " case Integer i1 -> i1;\n"+
+ " };\n"+
+ " }\n"+
+ " public static void main(String[] args) {\n"+
+ " System.out.println(foo(3));\n"+
+ " System.out.println(foo(0));\n"+
+ " }\n"+
+ "}",
+ },
+ "3\n"+
+ "0");
+ }
+ public void testBug575047_09() {
+ runConformTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " static int foo(String i) {\n"+
+ " return switch (i) {\n"+
+ " case \"\" -> 0;\n"+
+ " case String s -> -1;\n"+
+ " };\n"+
+ " }\n"+
+ " public static void main(String[] args) {\n"+
+ " System.out.println(foo(\"\"));\n"+
+ " System.out.println(foo(\"abc\"));\n"+
+ " }\n"+
+ "}",
+ },
+ "0\n" +
+ "-1");
+ }
+ public void testBug575047_10() {
+ runConformTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " static String foo(Object o) {\n" +
+ " return switch (o) {\n" +
+ " case String i && i.length() == 0 -> \"empty\";\n" +
+ " case String i && i.length() > 0 -> \"zero+\";\n" +
+ " case Color s -> s.toString();\n" +
+ " default -> \"unknown\";\n" +
+ " };\n" +
+ " }\n" +
+ " public static void main(String[] args) {\n" +
+ " System.out.println(foo(\"abc\"));\n" +
+ " System.out.println(foo(\"\"));\n" +
+ " System.out.println(Color.Blue);\n" +
+ " System.out.println(foo(args));\n" +
+ " }\n" +
+ "} \n" +
+ "enum Color {\n" +
+ " Blue, Red; \n" +
+ "}",
+ },
+ "zero+\n" +
+ "empty\n" +
+ "Blue\n" +
+ "unknown");
+ }
+ // Positive - Mix enum constants as well as suitable pattern var
+ public void testBug575047_11() {
+ runConformTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " static String foo(Color o) {\n" +
+ " return switch (o) {\n" +
+ " case Red -> \"Red\";\n" +
+ " case Color s -> s.toString();\n" +
+ " };\n" +
+ " }\n" +
+ " public static void main(String[] args) {\n" +
+ " System.out.println(Color.Red);\n" +
+ " System.out.println(Color.Blue);\n" +
+ " }\n" +
+ "} \n" +
+ "enum Color {\n" +
+ " Blue, Red; \n" +
+ "}",
+ },
+ "Red\n" +
+ "Blue");
+ }
+ public void testBug575047_12() {
+ runConformTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " static String foo(Color o) {\n" +
+ " return switch (o) {\n" +
+ " case Red -> \"Red\";\n" +
+ " case Color s && s == Color.Blue -> s.toString();" +
+ " case Color s -> s.toString();\n" +
+ " };\n" +
+ " }\n" +
+ " public static void main(String[] args) {\n" +
+ " System.out.println(Color.Red);\n" +
+ " System.out.println(Color.Blue);\n" +
+ " }\n" +
+ "} \n" +
+ "enum Color {\n" +
+ " Blue, Red; \n" +
+ "}",
+ },
+ "Red\n" +
+ "Blue");
+ }
+ public void testBug575047_13() {
+ runNegativeTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " static String foo(Color o) {\n" +
+ " return switch (o) {\n" +
+ " case Color s && s == Color.Blue -> s.toString();" +
+ " case Red -> \"Red\";\n" +
+ " case null -> \"\";\n" +
+ " };\n" +
+ " }\n" +
+ "} \n" +
+ "enum Color {\n" +
+ " Blue, Red; \n" +
+ "}",
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 3)\n" +
+ " return switch (o) {\n" +
+ " ^\n" +
+ "A Switch expression should cover all possible values\n" +
+ "----------\n");
+ }
+ public void testBug575047_14() {
+ runNegativeTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " static String foo(Color o) {\n" +
+ " return switch (o) {\n" +
+ " case Color s && s == Color.Blue -> s.toString();" +
+ " case Red -> \"Red\";\n" +
+ " };\n" +
+ " }\n" +
+ "} \n" +
+ "enum Color {\n" +
+ " Blue, Red; \n" +
+ "}",
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 3)\n" +
+ " return switch (o) {\n" +
+ " ^\n" +
+ "A Switch expression should cover all possible values\n" +
+ "----------\n");
+ }
+ public void testBug575047_15() {
+ runConformTest(
+ new String[] {
+ "X.java",
+ "public class X {\n" +
+ " static void foo(Integer o) {\n" +
+ " switch (o) {\n" +
+ " case 1: break;\n" +
+ " case Integer s && s == 2:\n" +
+ " System.out.println(s);break;\n" +
+ " case null, default:\n" +
+ " System.out.println(\"null/default\");\n" +
+ " }\n" +
+ " }\n" +
+ " public static void main(String[] args) {\n" +
+ " foo(null);\n" +
+ " }\n" +
+ "}",
+ },
+ "null/default");
+ }
+ public void testBug575360_001() {
+ runConformTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " static void foo(String myVar) { // String\n"+
+ " switch (myVar) {\n"+
+ " case null, default : System.out.println(\"hello\");\n"+
+ " }; \n"+
+ " }\n"+
+ " public static void main(String[] args) { \n"+
+ " foo(new String(\"Hello\")); \n"+
+ " }\n"+
+ "}",
+ },
+ "hello");
+ }
+ public void testBug575055_001() {
+ runNegativeTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " public int foo(CharSequence c) {\n" +
+ " return switch (c) {\n" +
+ " case CharSequence c1 && (c instanceof String c1 && c1.length() > 0) -> 0;\n" +
+ " default -> 0;\n" +
+ " };\n" +
+ " }" +
+ "}",
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 4)\n" +
+ " case CharSequence c1 && (c instanceof String c1 && c1.length() > 0) -> 0;\n" +
+ " ^^\n" +
+ "Duplicate local variable c1\n" +
+ "----------\n");
+ }
+ // Fails with Javac as it prints Javac instead of throwing NPE
+ // https://bugs.openjdk.java.net/browse/JDK-8272776
+ public void testBug575051_1() {
+ runConformTest(
+ new String[] {
+ "X.java",
+ "public class X {\n" +
+ " public void foo(Object o) {\n" +
+ " try{\n" +
+ " switch (o) {\n" +
+ " default:\n" +
+ " break;\n" +
+ " case String s :\n" +
+ " System.out.println(s);\n" +
+ " } \n" +
+ " } catch(Exception t) {\n" +
+ " t.printStackTrace(System.out);\n" +
+ " }\n" +
+ " }\n" +
+ " public static void main(String[] args) {\n" +
+ " (new X()).foo(null);\n" +
+ " }\n" +
+ "}",
+ },
+ "java.lang.NullPointerException\n"
+ + " at java.base/java.util.Objects.requireNonNull(Objects.java:208)\n"
+ + " at X.foo(X.java:4)\n"
+ + " at X.main(X.java:15)");
+ }
+ // Test we don't report any illegal fall-through to null case
+ public void testBug575051_2() {
+ runConformTest(
+ new String[] {
+ "X.java",
+ "public class X {\n" +
+ " public void foo(Object o) {\n" +
+ " switch (o) {\n" +
+ " case String s :\n" +
+ " System.out.println(s);\n" +
+ " //$FALL-THROUGH$\n" +
+ " case null:\n" +
+ " break;\n" +
+ " default : \n" +
+ " break;\n" +
+ " }\n" +
+ " }\n" +
+ " public static void main(String[] args) {\n" +
+ " (new X()).foo(null);\n" +
+ " }\n" +
+ "}",
+ },
+ "");
+ }
+ // Test we do report illegal fall-through to pattern
+ public void testBug575051_3() {
+ runNegativeTest(
+ new String[] {
+ "X.java",
+ "public class X {\n" +
+ " public void foo(Object o) {\n" +
+ " switch (o) {\n" +
+ " default : \n" +
+ " case String s :\n" +
+ " System.out.println();\n" +
+ " break;\n" +
+ " }\n" +
+ " }\n" +
+ " public static void main(String[] args) {\n" +
+ " (new X()).foo(null);\n" +
+ " }\n" +
+ "}",
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 5)\n" +
+ " case String s :\n" +
+ " ^^^^^^^^^^^^^\n" +
+ "Illegal fall-through to a pattern\n" +
+ "----------\n",
+ "");
+ }
+ public void testBug575571_1() {
+ Map<String, String> options = getCompilerOptions();
+ options.put(CompilerOptions.OPTION_ReportMissingDefaultCase, CompilerOptions.WARNING);
+ runWarningTest(
+ new String[] {
+ "X.java",
+ "public class X {\n" +
+ " public void foo(Color o) {\n" +
+ " switch (o) {\n" +
+ " case Blue:\n" +
+ " break;\n" +
+ " }\n" +
+ " }\n" +
+ " public static void main(String[] args) {}\n" +
+ "}\n" +
+ "enum Color { Blue; }\n",
+ },
+ "----------\n" +
+ "1. WARNING in X.java (at line 3)\n" +
+ " switch (o) {\n" +
+ " ^\n" +
+ "The switch over the enum type Color should have a default case\n" +
+ "----------\n",
+ options);
+ }
+ public void testBug575571_2() {
+ runNegativeTest(
+ new String[] {
+ "X.java",
+ "public class X {\n" +
+ " public void foo(Color o) {\n" +
+ " switch (o) {\n" +
+ " case Blue:\n" +
+ " case Color c:\n" +
+ " break;\n" +
+ " }\n" +
+ " }\n" +
+ " public static void main(String[] args) {}\n" +
+ "}\n" +
+ "enum Color { Blue, Red; }\n",
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 5)\n" +
+ " case Color c:\n" +
+ " ^^^^^^^^^^^^\n" +
+ "Illegal fall-through to a pattern\n" +
+ "----------\n");
+ }
+ public void testBug575714_01() {
+ runNegativeTest(
+ new String[] {
+ "X.java",
+ "class X {\n"+
+ " static Object foo(Object o) {\n"+
+ " switch (o) {\n"+
+ " case Object __ -> throw new AssertionError(); \n"+
+ " }\n"+
+ " }\n"+
+ " public static void main(String[] args) {\n"+
+ " Zork();\n"+
+ " }\n"+
+ "}",
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 8)\n" +
+ " Zork();\n" +
+ " ^^^^\n" +
+ "The method Zork() is undefined for the type X\n" +
+ "----------\n");
+ }
+ public void testBug575714_02() {
+ runNegativeTest(
+ new String[] {
+ "X.java",
+ "class X {\n"+
+ " static Object foo(Object o) {\n"+
+ " switch (o) {\n"+
+ " case Object __ -> System.out.println(\"Hello\"); \n"+
+ " }\n"+
+ " }\n"+
+ " public static void main(String[] args) {\n"+
+ " X.foo(new X());\n"+
+ " }\n"+
+ "}",
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 2)\n" +
+ " static Object foo(Object o) {\n" +
+ " ^^^^^^^^^^^^^\n" +
+ "This method must return a result of type Object\n" +
+ "----------\n");
+ }
+ public void testBug575714_03() {
+ runConformTest(
+ new String[] {
+ "X.java",
+ "class X {\n"+
+ " static Object foo(Object o) {\n"+
+ " switch (o) {\n"+
+ " case Object __ -> System.out.println(\"Hello\"); \n"+
+ " }\n"+
+ " return null;\n"+
+ " }\n"+
+ " public static void main(String[] args) {\n"+
+ " X.foo(new X());\n"+
+ " }\n"+
+ "}",
+ },
+ "Hello");
+ }
+ public void testBug575714_04() {
+ runConformTest(
+ new String[] {
+ "X.java",
+ "class X {\n"+
+ " static Object foo(Object o) throws Exception {\n"+
+ " switch (o) {\n"+
+ " case Object __ -> throw new Exception(); \n"+
+ " }\n"+
+ " }\n"+
+ " public static void main(String[] args) {\n"+
+ " try {\n"+
+ " X.foo(new X());\n"+
+ " } catch (Exception e) {\n"+
+ " System.out.println(\"Hello\");\n"+
+ " }\n"+
+ " }\n"+
+ "}",
+ },
+ "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");
+ }
+ public void testBug575686_1() {
+ runNegativeTest(
+ new String[] {
+ "X.java",
+ "public class X {\n" +
+ " void m(Object o) {\n" +
+ " switch (o) {\n" +
+ " case Integer i1, String s1 ->\n" +
+ " System.out.print(s1);\n" +
+ " default -> System.out.print(\"default\");\n" +
+ " case Number n, null ->\n" +
+ " System.out.print(o);\n" +
+ " case null, Class c ->\n" +
+ " System.out.print(o);\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 i1, String s1 ->\n" +
+ " ^^^^^^^^^\n" +
+ "A switch label may not have more than one pattern case label element\n" +
+ "----------\n" +
+ "2. ERROR in X.java (at line 7)\n" +
+ " case Number n, null ->\n" +
+ " ^^^^\n" +
+ "Duplicate case\n" +
+ "----------\n" +
+ "3. ERROR in X.java (at line 9)\n" +
+ " case null, Class c ->\n" +
+ " ^^^^\n" +
+ "Duplicate case\n" +
+ "----------\n" +
+ "4. WARNING in X.java (at line 9)\n" +
+ " case null, Class c ->\n" +
+ " ^^^^^\n" +
+ "Class is a raw type. References to generic type Class<T> should be parameterized\n" +
+ "----------\n");
+ }
+ public void testBug575737_001() {
+ Map<String, String> options =getCompilerOptions();
+ options.put(CompilerOptions.OPTION_ReportPreviewFeatures, CompilerOptions.WARNING);
+
+ this.runNegativeTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " static void foo1(String o) {\n"+
+ " switch (o) {\n"+
+ " case null -> System.out.println(\"null\");\n"+
+ " case String s -> String.format(\"String %s\", s);\n"+
+ " }\n"+
+ " }\n"+
+ " public static void main(String[] args) {\n"+
+ " Zork();\n"+
+ " }\n"+
+ "}",
+ },
+ "----------\n" +
+ "1. WARNING in X.java (at line 4)\n" +
+ " case null -> System.out.println(\"null\");\n" +
+ " ^^^^\n" +
+ "You are using a preview language feature that may or may not be supported in a future release\n" +
+ "----------\n" +
+ "2. WARNING in X.java (at line 5)\n" +
+ " case String s -> String.format(\"String %s\", s);\n" +
+ " ^^^^^^^^\n" +
+ "You are using a preview language feature that may or may not be supported in a future release\n" +
+ "----------\n" +
+ "3. ERROR in X.java (at line 9)\n" +
+ " Zork();\n" +
+ " ^^^^\n" +
+ "The method Zork() is undefined for the type X\n" +
+ "----------\n",
+ null,
+ true,
+ options
+ );
+ }
+ public void testBug575737_002() {
+ Map<String, String> options =getCompilerOptions();
+ options.put(CompilerOptions.OPTION_ReportPreviewFeatures, CompilerOptions.INFO);
+
+ this.runNegativeTest(
+ new String[] {
+ "X.java",
+ "public class X {\n"+
+ " static void foo1(String o) {\n"+
+ " switch (o) {\n"+
+ " case null -> System.out.println(\"null\");\n"+
+ " case String s -> String.format(\"String %s\", s);\n"+
+ " }\n"+
+ " }\n"+
+ " public static void main(String[] args) {\n"+
+ " Zork();\n"+
+ " }\n"+
+ "}",
+ },
+ "----------\n" +
+ "1. INFO in X.java (at line 4)\n" +
+ " case null -> System.out.println(\"null\");\n" +
+ " ^^^^\n" +
+ "You are using a preview language feature that may or may not be supported in a future release\n" +
+ "----------\n" +
+ "2. INFO in X.java (at line 5)\n" +
+ " case String s -> String.format(\"String %s\", s);\n" +
+ " ^^^^^^^^\n" +
+ "You are using a preview language feature that may or may not be supported in a future release\n" +
+ "----------\n" +
+ "3. ERROR in X.java (at line 9)\n" +
+ " Zork();\n" +
+ " ^^^^\n" +
+ "The method Zork() is undefined for the type X\n" +
+ "----------\n",
+ null,
+ true,
+ options
+ );
+ }
+ public void testBug575738_001() {
+ runNegativeTest(
+ new String[] {
+ "X.java",
+ "public class X {\n" +
+ " private static void foo(Object o) {\n" +
+ " switch (o.hashCode()) {\n" +
+ " case int t: System.out.println(\"Integer\"); \n" +
+ " default : System.out.println(\"Object\"); \n" +
+ " }\n" +
+ " }\n" +
+ " public static void main(String[] args) { \n" +
+ " foo(\"Hello World\");\n" +
+ " }\n" +
+ "}"
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 4)\n" +
+ " case int t: System.out.println(\"Integer\"); \n" +
+ " ^^^^^\n" +
+ "Unexpected type int, expected class or array type\n" +
+ "----------\n");
+ }
+ public void testBug575738_002() {
+ runNegativeTest(
+ new String[] {
+ "X.java",
+ "public class X {\n" +
+ " private static void foo(Object o) {\n" +
+ " switch (o.hashCode()) {\n" +
+ " case Integer t: System.out.println(\"Integer\"); \n" +
+ " default : System.out.println(\"Object\"); \n" +
+ " }\n" +
+ " }\n" +
+ " public static void main(String[] args) { \n" +
+ " foo(\"Hello World\");\n" +
+ " }\n" +
+ "}"
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 4)\n" +
+ " case Integer t: System.out.println(\"Integer\"); \n" +
+ " ^^^^^^^^^\n" +
+ "Type mismatch: cannot convert from int to Integer\n" +
+ "----------\n");
+ }
+}
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/TestAll.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/TestAll.java
index 22ea1ed18..764f06020 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/TestAll.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/TestAll.java
@@ -8,6 +8,10 @@
*
* SPDX-License-Identifier: EPL-2.0
*
+ * This is an implementation of an early-draft specification developed under the Java
+ * Community Process (JCP) and is made available for testing and evaluation purposes
+ * only. The code is not compatible with any specification of the JCP.
+ *
* Contributors:
* IBM Corporation - initial API and implementation
* Technical University Berlin - adapted for Object Teams
@@ -201,7 +205,7 @@ public static Test suite() {
// add 15 specific test here (check duplicates)
ArrayList since_15 = new ArrayList();
- since_15.add(ClassFileReaderTest_15.class);
+ since_15.add(ClassFileReaderTest_17.class);
since_15.add(JavadocTest_15.class);
since_15.add(Unicode13Test.class);
since_15.add(BatchCompilerTest_15.class);
@@ -209,16 +213,22 @@ public static Test suite() {
// add 16 specific test here (check duplicates)
ArrayList since_16 = new ArrayList();
- since_16.add(SealedTypesTests.class);
since_16.add(LocalEnumTest.class);
since_16.add(LocalStaticsTest.class);
since_16.add(PreviewFeatureTest.class);
since_16.add(ValueBasedAnnotationTests.class);
since_16.add(BatchCompilerTest_16.class);
- since_16.add(RecordsRestrictedClassTest.class);
since_16.add(PatternMatching16Test.class);
+ since_16.add(RecordsRestrictedClassTest.class);
since_16.add(JavadocTestForRecord.class);
+ // add 17 specific test here (check duplicates)
+ ArrayList since_17 = new ArrayList();
+ since_17.add(SealedTypesTests.class);
+ since_17.add(SwitchPatternTest.class);
+ since_17.add(InstanceofPrimaryPatternTest.class);
+ since_17.add(NullAnnotationTests17.class);
+
// Build final test suite
TestSuite all = new TestSuite(TestAll.class.getName());
all.addTest(new TestSuite(StandAloneASTParserTest.class));
@@ -396,6 +406,25 @@ public static Test suite() {
TestCase.resetForgottenFilters(tests_16);
all.addTest(AbstractCompilerTest.buildComplianceTestSuite(ClassFileConstants.getComplianceLevelForJavaVersion(ClassFileConstants.MAJOR_VERSION_16), tests_16));
}
+ if ((possibleComplianceLevels & AbstractCompilerTest.F_17) != 0) {
+ ArrayList tests_17 = (ArrayList)standardTests.clone();
+ tests_17.addAll(since_1_4);
+ tests_17.addAll(since_1_5);
+ tests_17.addAll(since_1_6);
+ tests_17.addAll(since_1_7);
+ tests_17.addAll(since_1_8);
+ tests_17.addAll(since_9);
+ tests_17.addAll(since_10);
+ tests_17.addAll(since_11);
+ tests_17.addAll(since_12);
+ tests_17.addAll(since_13);
+ tests_17.addAll(since_14);
+ tests_17.addAll(since_15);
+ tests_17.addAll(since_16);
+ tests_17.addAll(since_17);
+ TestCase.resetForgottenFilters(tests_17);
+ all.addTest(AbstractCompilerTest.buildComplianceTestSuite(ClassFileConstants.getComplianceLevelForJavaVersion(ClassFileConstants.MAJOR_VERSION_17), tests_17));
+ }
all.addTest(new TestSuite(Jsr14Test.class));
return all;
}
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/ValueBasedAnnotationTests.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/ValueBasedAnnotationTests.java
index 2ea38dead..0728691bf 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/ValueBasedAnnotationTests.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/ValueBasedAnnotationTests.java
@@ -8,11 +8,17 @@
*
* SPDX-License-Identifier: EPL-2.0
*
+ * This is an implementation of an early-draft specification developed under the Java
+ * Community Process (JCP) and is made available for testing and evaluation purposes
+ * only. The code is not compatible with any specification of the JCP.
+ *
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jdt.core.tests.compiler.regression;
import java.util.Map;
+
+import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;
import org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
import junit.framework.Test;
public class ValueBasedAnnotationTests extends AbstractRegressionTest {
@@ -34,12 +40,9 @@ public class ValueBasedAnnotationTests extends AbstractRegressionTest {
@Override
protected Map<String, String> getCompilerOptions() {
Map<String, String> defaultOptions = super.getCompilerOptions();
- defaultOptions.put(CompilerOptions.OPTION_Compliance, CompilerOptions.VERSION_16);
- defaultOptions.put(CompilerOptions.OPTION_Source, CompilerOptions.VERSION_16);
- defaultOptions.put(CompilerOptions.OPTION_TargetPlatform, CompilerOptions.VERSION_16);
- defaultOptions.put(CompilerOptions.OPTION_EnablePreviews, CompilerOptions.ENABLED);
- defaultOptions.put(CompilerOptions.OPTION_ReportPreviewFeatures, CompilerOptions.IGNORE);
- defaultOptions.put(CompilerOptions.OPTION_Store_Annotations, CompilerOptions.ENABLED);
+ if (this.complianceLevel >= ClassFileConstants.getLatestJDKLevel()) {
+ defaultOptions.put(CompilerOptions.OPTION_EnablePreviews, CompilerOptions.ENABLED);
+ }
return defaultOptions;
}
protected void runWarningTest(String[] testFiles, String expectedCompilerLog) {
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/util/AbstractCompilerTest.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/util/AbstractCompilerTest.java
index 35b6bba07..164dad74b 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/util/AbstractCompilerTest.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/util/AbstractCompilerTest.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2000, 2020 IBM Corporation and others.
+ * Copyright (c) 2000, 2021 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -8,6 +8,10 @@
*
* SPDX-License-Identifier: EPL-2.0
*
+ * This is an implementation of an early-draft specification developed under the Java
+ * Community Process (JCP) and is made available for testing and evaluation purposes
+ * only. The code is not compatible with any specification of the JCP.
+ *
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
@@ -48,6 +52,7 @@ public class AbstractCompilerTest extends TestCase {
public static final int F_14 = 0x800;
public static final int F_15 = 0x1000;
public static final int F_16 = 0x2000;
+ public static final int F_17 = 0x4000;
public static final boolean RUN_JAVAC = CompilerOptions.ENABLED.equals(System.getProperty("run.javac"));
public static final boolean PERFORMANCE_ASSERTS = !CompilerOptions.DISABLED.equals(System.getProperty("jdt.performance.asserts"));
@@ -66,6 +71,7 @@ public class AbstractCompilerTest extends TestCase {
protected static boolean isJRE14Plus = false;
protected static boolean isJRE15Plus = false;
protected static boolean isJRE16Plus = false;
+ protected static boolean isJRE17Plus = false;
protected static boolean reflectNestedClassUseDollar;
public static int[][] complianceTestLevelMapping = new int[][] {
@@ -83,6 +89,7 @@ public class AbstractCompilerTest extends TestCase {
new int[] {F_14, ClassFileConstants.MAJOR_VERSION_14},
new int[] {F_15, ClassFileConstants.MAJOR_VERSION_15},
new int[] {F_16, ClassFileConstants.MAJOR_VERSION_16},
+ new int[] {F_17, ClassFileConstants.MAJOR_VERSION_17},
};
/**
@@ -312,7 +319,8 @@ public class AbstractCompilerTest extends TestCase {
public static int getPossibleComplianceLevels() {
if (possibleComplianceLevels == UNINITIALIZED) {
String specVersion = System.getProperty("java.specification.version");
- isJRE16Plus = CompilerOptions.VERSION_16.equals(specVersion);
+ isJRE17Plus = CompilerOptions.VERSION_17.equals(specVersion);
+ isJRE16Plus = isJRE17Plus || CompilerOptions.VERSION_16.equals(specVersion);
isJRE15Plus = isJRE16Plus || CompilerOptions.VERSION_15.equals(specVersion);
isJRE14Plus = isJRE15Plus || CompilerOptions.VERSION_14.equals(specVersion);
isJRE13Plus = isJRE14Plus || CompilerOptions.VERSION_13.equals(specVersion);
@@ -365,6 +373,9 @@ public class AbstractCompilerTest extends TestCase {
} else if (CompilerOptions.VERSION_16.equals(compliance)) {
if (isJRE16Plus)
possibleComplianceLevels |= F_16;
+ } else if (CompilerOptions.VERSION_17.equals(compliance)) {
+ if (isJRE17Plus)
+ possibleComplianceLevels |= F_17;
} else {
System.out.println("Ignoring invalid compliance (" + compliance + ")");
System.out.print("Use one of ");
@@ -448,6 +459,10 @@ public class AbstractCompilerTest extends TestCase {
if (canRun16) {
possibleComplianceLevels |= F_16;
}
+ boolean canRun17 = canRun16 && !CompilerOptions.VERSION_16.equals(specVersion);
+ if (canRun17) {
+ possibleComplianceLevels |= F_17;
+ }
} else if ("1.0".equals(specVersion)
|| CompilerOptions.VERSION_1_1.equals(specVersion)
|| CompilerOptions.VERSION_1_2.equals(specVersion)
@@ -478,6 +493,9 @@ public class AbstractCompilerTest extends TestCase {
possibleComplianceLevels |= F_15;
if (!CompilerOptions.VERSION_15.equals(specVersion)) {
possibleComplianceLevels |= F_16;
+ if (!CompilerOptions.VERSION_16.equals(specVersion)) {
+ possibleComplianceLevels |= F_17;
+ }
}
}
}
@@ -666,7 +684,7 @@ public class AbstractCompilerTest extends TestCase {
int major = Integer.parseInt(ver) + ClassFileConstants.MAJOR_VERSION_0;
return "version " + ver + " : " + major + ".0";
}
- if (compliance >= ClassFileConstants.getComplianceLevelForJavaVersion(ClassFileConstants.MAJOR_VERSION_16)) return version; // keep this stmt for search for next bump up
+ if (compliance >= ClassFileConstants.getComplianceLevelForJavaVersion(ClassFileConstants.MAJOR_VERSION_17)) return version; // keep this stmt for search for next bump up
return version;
}

Back to the top