--- old/test/langtools/tools/javac/versions/Versions.java 2018-06-28 20:10:43.889467392 -0700 +++ new/test/langtools/tools/javac/versions/Versions.java 2018-06-28 20:10:43.005025363 -0700 @@ -41,105 +41,157 @@ import java.util.List; import java.util.ArrayList; import java.util.Arrays; - +import java.util.Set; public class Versions { - protected JavaCompiler javacompiler; - protected int failedCases; + static JavaCompiler javacompiler = ToolProvider.getSystemJavaCompiler(); + static int failedCases = 0; - public Versions() throws IOException { - javacompiler = ToolProvider.getSystemJavaCompiler(); + public static void main(String... args) throws IOException { genSourceFiles(); - failedCases = 0; + run(); } - public static void main(String... args) throws IOException { - Versions versions = new Versions(); - versions.run(); + public static final Set retiredSources = + Set.of("1.2", "1.3", "1.4", "1.5"); + + public static final Set validSources = + Set.of("1.6", "1.7", "1.8", "1.9", "1.10", "11", "12"); + + public static final String LATEST_MAJOR_VERSION = "56.0"; + + static enum SourceTarget { + // Reminder: update switch in checksrc when adding or removing values. + SIX(true, "50.0", "6"), + SEVEN(true, "51.0", "7"), + EIGHT(true, "52.0", "8"), + NINE(true, "53.0", "9"), + TEN(true, "54.0", "10"), + ELEVEN(false, "55.0", "11"), + TWELVE(false, "56.0", "12"); + + private boolean dotOne; + private String classFileVer; + private String target; + + private SourceTarget(boolean dotOne, String classFileVer, String target) { + this.dotOne = dotOne; + this.classFileVer = classFileVer; + this.target = target; + } + + public static void checksrc(SourceTarget st, String... args) { + switch(st) { + case SIX: + Versions.checksrc16(args); + break; + + case SEVEN: + Versions.checksrc17(args); + break; + + case EIGHT: + Versions.checksrc18(args); + break; + + case NINE: + Versions.checksrc19(args); + break; + + case TEN: + Versions.checksrc110(args); + break; + + case ELEVEN: + Versions.checksrc111(args); + break; + + case TWELVE: + Versions.checksrc112(args); + break; + + default: + throw new AssertionError(); + } + } + + public boolean dotOne() { + return dotOne; + } + + public String classFileVer() { + return classFileVer; + } + + public String target() { + return target; + } } - void run() { + static void run() { String TC = ""; System.out.println("Version.java: Starting"); - String LATEST_MAJOR_VERSION = "56.0"; check(LATEST_MAJOR_VERSION); - check(LATEST_MAJOR_VERSION, "-source 1.6"); - check(LATEST_MAJOR_VERSION, "-source 1.7"); - check(LATEST_MAJOR_VERSION, "-source 1.8"); - check(LATEST_MAJOR_VERSION, "-source 1.9"); - check(LATEST_MAJOR_VERSION, "-source 1.10"); - check(LATEST_MAJOR_VERSION, "-source 11"); - check(LATEST_MAJOR_VERSION, "-source 12"); - - check_source_target(true, "50.0", "6", "6"); - check_source_target(true, "51.0", "6", "7"); - check_source_target(true, "51.0", "7", "7"); - check_source_target(true, "52.0", "6", "8"); - check_source_target(true, "52.0", "7", "8"); - check_source_target(true, "52.0", "8", "8"); - check_source_target(true, "53.0", "6", "9"); - check_source_target(true, "53.0", "7", "9"); - check_source_target(true, "53.0", "8", "9"); - check_source_target(true, "53.0", "9", "9"); - check_source_target(true, "54.0", "6", "10"); - check_source_target(true, "54.0", "7", "10"); - check_source_target(true, "54.0", "8", "10"); - check_source_target(true, "54.0", "9", "10"); - check_source_target(true, "54.0", "10", "10"); - check_source_target(false, "55.0", "6", "11"); - check_source_target(false, "55.0", "7", "11"); - check_source_target(false, "55.0", "8", "11"); - check_source_target(false, "55.0", "9", "11"); - check_source_target(false, "55.0", "10", "11"); - check_source_target(false, "55.0", "11", "11"); - check_source_target(false, "56.0", "12", "12"); - - checksrc16("-source 1.6"); - checksrc16("-source 6"); - checksrc16("-source 1.6", "-target 1.6"); - checksrc16("-source 6", "-target 6"); - checksrc17("-source 1.7"); - checksrc17("-source 7"); - checksrc17("-source 1.7", "-target 1.7"); - checksrc17("-source 7", "-target 7"); - checksrc18("-source 1.8"); - checksrc18("-source 8"); - checksrc18("-source 1.8", "-target 1.8"); - checksrc18("-source 8", "-target 8"); - checksrc19("-source 1.9"); - checksrc19("-source 9"); - checksrc19("-source 1.9", "-target 1.9"); - checksrc19("-source 9", "-target 9"); - checksrc110(); - checksrc110("-source 1.10"); - checksrc110("-source 10"); - checksrc110("-source 1.10", "-target 1.10"); - checksrc110("-source 10", "-target 10"); - checksrc111("-source 11"); - checksrc111("-source 11", "-target 11"); - checksrc112("-source 12"); - checksrc112("-source 12", "-target 12"); - checksrc112("-target 12"); - - fail("-source 7", "-target 1.6", "Base.java"); - fail("-source 8", "-target 1.6", "Base.java"); - fail("-source 8", "-target 1.7", "Base.java"); - fail("-source 9", "-target 1.7", "Base.java"); - fail("-source 9", "-target 1.8", "Base.java"); - fail("-source 10", "-target 1.7", "Base.java"); - fail("-source 10", "-target 1.8", "Base.java"); - fail("-source 11", "-target 1.9", "Base.java"); - fail("-source 11", "-target 1.10", "Base.java"); - fail("-source 12", "-target 1.10", "Base.java"); - fail("-source 12", "-target 11", "Base.java"); - - fail("-source 1.5", "-target 1.5", "Base.java"); - fail("-source 1.4", "-target 1.4", "Base.java"); - fail("-source 1.3", "-target 1.3", "Base.java"); - fail("-source 1.2", "-target 1.2", "Base.java"); + for (String source : validSources) { + check(LATEST_MAJOR_VERSION, "-source " + source); + } + + // Verify that a -source value less than a -target value is + // accepted and that the resulting class files are dependent + // on the target setting alone. + SourceTarget[] sourceTargets = SourceTarget.values(); + for (int i = 0; i < sourceTargets.length; i++) { + SourceTarget st = sourceTargets[i]; + String classFileVer = st.classFileVer(); + String target = st.target(); + boolean dotOne = st.dotOne(); + check_source_target(dotOne, classFileVer, target, target); + for (int j = i; j > 0; j--) { + String source = sourceTargets[j].target(); + check_source_target(dotOne, classFileVer, source, target); + } + } + + // Verify acceptance of different combinations of -source N, + // -target N + for (int i = 0; i < sourceTargets.length; i++) { + SourceTarget st = sourceTargets[i]; + + SourceTarget.checksrc(st, "-source " + st.target()); + SourceTarget.checksrc(st, "-source " + st.target(), "-target " + st.target()); + + if (st.dotOne()) { + SourceTarget.checksrc(st, "-source 1." + st.target()); + SourceTarget.checksrc(st, "-source 1." + st.target(), "-target 1." + st.target()); + } + + if (i == sourceTargets.length) { + // Can use -target without -source setting only for + // most recent target + SourceTarget.checksrc(st, "-target " + st.target()); + + if (!st.classFileVer().equals(LATEST_MAJOR_VERSION)) { + throw new RuntimeException(st + + "does not have class file version" + + LATEST_MAJOR_VERSION); + } + } + } + + // Verify that -source N -target (N-1) is rejected + for (int i = 1 /* Skip zeroth value */; i < sourceTargets.length; i++) { + fail("-source " + sourceTargets[i].target(), + "-target " + sourceTargets[i-1].target(), + "Base.java"); + } + + // Previously supported source/target values + for (String source : retiredSources) { + fail("-source " + source, "-target " + source, "Base.java"); + } if (failedCases > 0) { System.err.println("failedCases = " + String.valueOf(failedCases)); @@ -148,7 +200,7 @@ } - protected void printargs(String fname,String... args) { + static void printargs(String fname,String... args) { System.out.printf("test: %s", fname); for (String onearg : args) { System.out.printf(" %s", onearg); @@ -156,7 +208,7 @@ System.out.printf("\n", fname); } - protected void check_source_target(boolean dotOne, String... args) { + static void check_source_target(boolean dotOne, String... args) { printargs("check_source_target", args); check_target(dotOne, args[0], args[1], args[2]); if (dotOne) { @@ -164,14 +216,14 @@ } } - protected void check_target(boolean dotOne, String... args) { + static void check_target(boolean dotOne, String... args) { check(args[0], "-source " + args[1], "-target " + args[2]); if (dotOne) { check(args[0], "-source " + args[1], "-target 1." + args[2]); } } - protected void check(String major, String... args) { + static void check(String major, String... args) { printargs("check", args); List jcargs = new ArrayList<>(); jcargs.add("-Xlint:-options"); @@ -197,7 +249,7 @@ } } - protected void checksrc16(String... args) { + static void checksrc16(String... args) { printargs("checksrc16", args); int asize = args.length; String[] newargs = new String[asize + 1]; @@ -208,7 +260,7 @@ fail(newargs); } - protected void checksrc17(String... args) { + static void checksrc17(String... args) { printargs("checksrc17", args); int asize = args.length; String[] newargs = new String[asize+1]; @@ -219,7 +271,7 @@ fail(newargs); } - protected void checksrc18(String... args) { + static void checksrc18(String... args) { printargs("checksrc18", args); int asize = args.length; String[] newargs = new String[asize+1]; @@ -232,12 +284,12 @@ fail(newargs); } - protected void checksrc19(String... args) { + static void checksrc19(String... args) { printargs("checksrc19", args); checksrc18(args); } - protected void checksrc110(String... args) { + static void checksrc110(String... args) { printargs("checksrc110", args); int asize = args.length; String[] newargs = new String[asize+1]; @@ -250,17 +302,17 @@ pass(newargs); } - protected void checksrc111(String... args) { + static void checksrc111(String... args) { printargs("checksrc111", args); checksrc110(args); } - protected void checksrc112(String... args) { + static void checksrc112(String... args) { printargs("checksrc112", args); checksrc111(args); } - protected void pass(String... args) { + static void pass(String... args) { printargs("pass", args); List jcargs = new ArrayList(); @@ -298,7 +350,7 @@ } - protected void fail(String... args) { + static void fail(String... args) { printargs("fail", args); List jcargs = new ArrayList(); @@ -334,7 +386,7 @@ } } - protected boolean compile(String sourceFile, Listoptions) { + static boolean compile(String sourceFile, Listoptions) { JavaCompiler.CompilationTask jctask; try (StandardJavaFileManager fm = javacompiler.getStandardFileManager(null, null, null)) { Iterable files = fm.getJavaFileObjects(sourceFile); @@ -358,13 +410,13 @@ } } - protected void writeSourceFile(String fileName, String body) throws IOException{ + static void writeSourceFile(String fileName, String body) throws IOException{ try (Writer fw = new FileWriter(fileName)) { fw.write(body); } } - protected void genSourceFiles() throws IOException{ + static void genSourceFiles() throws IOException{ /* Create a file that executes with all supported versions. */ writeSourceFile("Base.java","public class Base { }\n"); @@ -401,7 +453,7 @@ } - protected boolean checkClassFileVersion + static boolean checkClassFileVersion (String filename,String classVersionNumber) { ByteBuffer bb = ByteBuffer.allocate(1024); try (FileChannel fc = new FileInputStream(filename).getChannel()) {