From 53abba3a5acee3e4d776fe8a42a307b827fda54d Mon Sep 17 00:00:00 2001 From: Liam Miller-Cushon Date: Fri, 16 Jun 2023 16:43:22 +0000 Subject: [PATCH] 8309499: javac fails to report compiler.err.no.java.lang with annotation processing enabled Co-authored-by: Paula Toth Reviewed-by: vromero --- .../sun/tools/javac/main/JavaCompiler.java | 7 + ...NoJavaLangWithAnnotationProcessorTest.java | 124 ++++++++++++++++++ 2 files changed, 131 insertions(+) create mode 100644 test/langtools/tools/javac/fatalErrors/NoJavaLangWithAnnotationProcessorTest.java diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/main/JavaCompiler.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/main/JavaCompiler.java index 39d64bfdc42..34e261d5445 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/main/JavaCompiler.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/main/JavaCompiler.java @@ -971,6 +971,13 @@ public class JavaCompiler { } catch (Abort ex) { if (devVerbose) ex.printStackTrace(System.err); + + // In case an Abort was thrown before processAnnotations could be called, + // we could have deferred diagnostics that haven't been reported. + if (deferredDiagnosticHandler != null) { + deferredDiagnosticHandler.reportDeferredDiagnostics(); + log.popDiagnosticHandler(deferredDiagnosticHandler); + } } finally { if (verbose) { elapsed_msec = elapsed(start_msec); diff --git a/test/langtools/tools/javac/fatalErrors/NoJavaLangWithAnnotationProcessorTest.java b/test/langtools/tools/javac/fatalErrors/NoJavaLangWithAnnotationProcessorTest.java new file mode 100644 index 00000000000..b5e7492b6c8 --- /dev/null +++ b/test/langtools/tools/javac/fatalErrors/NoJavaLangWithAnnotationProcessorTest.java @@ -0,0 +1,124 @@ +/* + * Copyright (c) 2023, Alphabet LLC. 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. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8309499 + * @summary Verify that java.lang unavailable error is not swallowed when + * annotation processor is used. + * @library /tools/lib /tools/javac/lib + * @modules jdk.compiler/com.sun.tools.javac.api + * jdk.compiler/com.sun.tools.javac.main + * @build toolbox.ToolBox toolbox.JavacTask + * @build NoJavaLangWithAnnotationProcessorTest JavacTestingAbstractProcessor + * @run main NoJavaLangWithAnnotationProcessorTest + */ + +import java.nio.file.*; +import java.util.Set; + +import javax.annotation.processing.RoundEnvironment; +import javax.lang.model.element.TypeElement; + +import toolbox.JavacTask; +import toolbox.Task; +import toolbox.ToolBox; + +public class NoJavaLangWithAnnotationProcessorTest extends JavacTestingAbstractProcessor { + + private static final String noJavaLangSrc = + "public class NoJavaLang {\n" + + " private String s;\n" + + "}"; + + private static final String compilerErrorMessage = + "compiler.err.no.java.lang"; + + // No-Op annotation processor + @Override + public boolean process(Set annotations, RoundEnvironment roundEnv) { + return false; + } + + public static void main(String[] args) throws Exception { + new NoJavaLangWithAnnotationProcessorTest().run(); + } + + final ToolBox tb = new ToolBox(); + + void run() throws Exception { + testCompilesNormallyWithNonEmptyBootClassPath(); + testBootClassPath(); + testModulePath(); + } + + // Normal case with java.lang available + void testCompilesNormallyWithNonEmptyBootClassPath() { + new JavacTask(tb) + .sources(noJavaLangSrc) + .options("-processor", "NoJavaLangWithAnnotationProcessorTest") + .run(); + } + + + // test with bootclasspath, for as long as its around + void testBootClassPath() { + String[] bcpOpts = {"-XDrawDiagnostics", "-Xlint:-options", "-source", "8", "-target", "8", + "-bootclasspath", ".", "-classpath", ".", + "-processor", "NoJavaLangWithAnnotationProcessorTest", "-processorpath", System.getProperty("test.class.path") }; + test(bcpOpts, compilerErrorMessage); + } + + // test with module path + void testModulePath() throws Exception { + // need to ensure there is an empty java.base to avoid different error message + Files.createDirectories(Paths.get("modules/java.base")); + new JavacTask(tb) + .sources("module java.base { }", + "package java.lang; public class Object {}") + .outdir("modules/java.base") + .run(); + + Files.delete(Paths.get("modules", "java.base", "java", "lang", "Object.class")); + + String[] mpOpts = {"-XDrawDiagnostics", "--system", "none", "--module-path", "modules", + "-processor", "NoJavaLangWithAnnotationProcessorTest", "-processorpath", System.getProperty("test.class.path") }; + test(mpOpts, compilerErrorMessage); + } + + private void test(String[] options, String expect) { + System.err.println("Testing " + java.util.Arrays.toString(options)); + + String out = new JavacTask(tb) + .options(options) + .sources(noJavaLangSrc) + .run(Task.Expect.FAIL, 1) + .writeAll() + .getOutput(Task.OutputKind.DIRECT); + + if (!out.contains(expect)) { + throw new AssertionError("javac generated error output is not correct"); + } + } + +}