test/langtools/tools/javac/7199823/InnerClassCannotBeVerified.java
changeset 50735 2f2af62dfac7
parent 47216 71c04702a3d5
--- a/test/langtools/tools/javac/7199823/InnerClassCannotBeVerified.java	Fri Jun 22 17:49:21 2018 -0700
+++ b/test/langtools/tools/javac/7199823/InnerClassCannotBeVerified.java	Sat Jun 23 01:32:41 2018 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -29,6 +29,7 @@
  * @run main InnerClassCannotBeVerified
  */
 
+import java.nio.file.NoSuchFileException;
 import java.util.Arrays;
 import javax.tools.JavaFileObject;
 import java.net.URI;
@@ -43,6 +44,17 @@
 
 public class InnerClassCannotBeVerified {
 
+    enum CompilationKind {
+        PRE_NESTMATES("-source", "10", "-target", "10"),
+        POST_NESTMATES();
+
+        String[] opts;
+
+        CompilationKind(String... opts) {
+            this.opts = opts;
+        }
+    }
+
     private static final String errorMessage =
             "Compile error while compiling the following source:\n";
 
@@ -51,34 +63,49 @@
     }
 
     void run() throws Exception {
-        JavaCompiler comp = ToolProvider.getSystemJavaCompiler();
-        JavaSource source = new JavaSource();
-        JavacTask ct = (JavacTask)comp.getTask(null, null, null,
-                null, null, Arrays.asList(source));
-        try {
-            if (!ct.call()) {
+        for (CompilationKind ck : CompilationKind.values()) {
+            File file = new File("Test$1.class");
+            if (file.exists()) {
+                file.delete();
+            }
+            JavaCompiler comp = ToolProvider.getSystemJavaCompiler();
+            JavaSource source = new JavaSource();
+            JavacTask ct = (JavacTask)comp.getTask(null, null, null,
+                    Arrays.asList(ck.opts), null, Arrays.asList(source));
+            try {
+                if (!ct.call()) {
+                    throw new AssertionError(errorMessage +
+                            source.getCharContent(true));
+                }
+            } catch (Throwable ex) {
                 throw new AssertionError(errorMessage +
                         source.getCharContent(true));
             }
-        } catch (Throwable ex) {
-            throw new AssertionError(errorMessage +
-                    source.getCharContent(true));
+            check(ck);
         }
-        check();
     }
 
-    private void check() throws IOException, ConstantPoolException {
-        File file = new File("Test$1.class");
-        ClassFile classFile = ClassFile.read(file);
-        boolean inheritsFromObject =
-                classFile.getSuperclassName().equals("java/lang/Object");
-        boolean implementsNoInterface = classFile.interfaces.length == 0;
-        boolean noMethods = classFile.methods.length == 0;
-        if (!(inheritsFromObject &&
-              implementsNoInterface &&
-              noMethods)) {
-            throw new AssertionError("The inner classes reused as " +
-                    "access constructor tag for this code must be empty");
+    private void check(CompilationKind ck) throws IOException, ConstantPoolException {
+        try {
+            File file = new File("Test$1.class");
+            ClassFile classFile = ClassFile.read(file);
+            if (ck == CompilationKind.POST_NESTMATES) {
+                throw new AssertionError("Unexpected constructor tag class!");
+            }
+            boolean inheritsFromObject =
+                    classFile.getSuperclassName().equals("java/lang/Object");
+            boolean implementsNoInterface = classFile.interfaces.length == 0;
+            boolean noMethods = classFile.methods.length == 0;
+            if (!(inheritsFromObject &&
+                    implementsNoInterface &&
+                    noMethods)) {
+                throw new AssertionError("The inner classes reused as " +
+                        "access constructor tag for this code must be empty");
+            }
+        } catch (NoSuchFileException ex) {
+            if (ck == CompilationKind.PRE_NESTMATES) {
+                throw new AssertionError("Constructor tag class missing!");
+            }
         }
     }