--- old/test/langtools/tools/javac/7199823/InnerClassCannotBeVerified.java 2018-06-20 01:16:24.907053616 -0400 +++ new/test/langtools/tools/javac/7199823/InnerClassCannotBeVerified.java 2018-06-20 01:16:23.342963514 -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!"); + } } }