< 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 >