< prev index next >

test/langtools/tools/javac/7199823/InnerClassCannotBeVerified.java

Print this page

        

@@ -1,7 +1,7 @@
 /*
- * 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
  * under the terms of the GNU General Public License version 2 only, as
  * published by the Free Software Foundation.

@@ -27,10 +27,11 @@
  * @summary javac generates inner class that can't be verified
  * @modules jdk.jdeps/com.sun.tools.classfile
  * @run main InnerClassCannotBeVerified
  */
 
+import java.nio.file.NoSuchFileException;
 import java.util.Arrays;
 import javax.tools.JavaFileObject;
 import java.net.URI;
 import javax.tools.SimpleJavaFileObject;
 import javax.tools.ToolProvider;

@@ -41,47 +42,73 @@
 import java.io.File;
 import java.io.IOException;
 
 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";
 
     public static void main(String... args) throws Exception {
         new InnerClassCannotBeVerified().run();
     }
 
     void run() throws Exception {
+        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,
-                null, null, Arrays.asList(source));
+                    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));
         }
-        check();
+            check(ck);
+        }
     }
 
-    private void check() throws IOException, ConstantPoolException {
+    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!");
+            }
+        }
     }
 
     class JavaSource extends SimpleJavaFileObject {
 
         String internalSource =
< prev index next >