changeset 1863:e42c27026290

8016099: Some @SuppressWarnings annotations ignored ( unchecked, rawtypes ) Reviewed-by: jjg
author vromero
date Thu, 27 Jun 2013 16:04:05 +0100
parents 8e3d391c88c6
children d137ce373c4c
files src/share/classes/com/sun/tools/javac/comp/Attr.java src/share/classes/com/sun/tools/javac/comp/Check.java test/tools/javac/T8016099/UncheckedWarningRegressionTest.java test/tools/javac/T8016099/UncheckedWarningRegressionTest.out
diffstat 4 files changed, 57 insertions(+), 21 deletions(-) [+]
line wrap: on
line diff
--- a/src/share/classes/com/sun/tools/javac/comp/Attr.java	Thu Jun 27 09:54:50 2013 +0100
+++ b/src/share/classes/com/sun/tools/javac/comp/Attr.java	Thu Jun 27 16:04:05 2013 +0100
@@ -756,25 +756,15 @@
                                       JCTree.JCExpression initializer,
                                       Type type) {
 
-        // in case no lint value has been set up for this env, scan up
-        // env stack looking for smallest enclosing env for which it is set.
-        Env<AttrContext> lintEnv = env;
-        while (lintEnv.info.lint == null)
-            lintEnv = lintEnv.next;
-
-        // Having found the enclosing lint value, we can initialize the lint value for this class
-        // ... but ...
-        // There's a problem with evaluating annotations in the right order, such that
-        // env.info.enclVar.attributes_field might not yet have been evaluated, and so might be
-        // null. In that case, calling augment will throw an NPE. To avoid this, for now we
-        // revert to the jdk 6 behavior and ignore the (unevaluated) attributes.
-        if (env.info.enclVar.annotationsPendingCompletion()) {
-            env.info.lint = lintEnv.info.lint;
-        } else {
-            env.info.lint = lintEnv.info.lint.augment(env.info.enclVar);
-        }
-
-        Lint prevLint = chk.setLint(env.info.lint);
+        /*  When this env was created, it didn't have the correct lint nor had
+         *  annotations has been processed.
+         *  But now at this phase we have already processed annotations and the
+         *  correct lint must have been set in chk, so we should use that one to
+         *  attribute the initializer.
+         */
+        Lint prevLint = env.info.lint;
+        env.info.lint = chk.getLint();
+
         JavaFileObject prevSource = log.useSource(env.toplevel.sourcefile);
 
         try {
@@ -786,10 +776,11 @@
             memberEnter.typeAnnotate(initializer, env, null);
             annotate.flush();
             Type itype = attribExpr(initializer, env, type);
-            if (itype.constValue() != null)
+            if (itype.constValue() != null) {
                 return coerce(itype, type).constValue();
-            else
+            } else {
                 return null;
+            }
         } finally {
             env.info.lint = prevLint;
             log.useSource(prevSource);
--- a/src/share/classes/com/sun/tools/javac/comp/Check.java	Thu Jun 27 09:54:50 2013 +0100
+++ b/src/share/classes/com/sun/tools/javac/comp/Check.java	Thu Jun 27 16:04:05 2013 +0100
@@ -218,6 +218,14 @@
         return prev;
     }
 
+    /*  This idiom should be used only in cases when it is needed to set the lint
+     *  of an environment that has been created in a phase previous to annotations
+     *  processing.
+     */
+    Lint getLint() {
+        return lint;
+    }
+
     DeferredLintHandler setDeferredLintHandler(DeferredLintHandler newDeferredLintHandler) {
         DeferredLintHandler prev = deferredLintHandler;
         deferredLintHandler = newDeferredLintHandler;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/tools/javac/T8016099/UncheckedWarningRegressionTest.java	Thu Jun 27 16:04:05 2013 +0100
@@ -0,0 +1,32 @@
+/*
+ * @test /nodynamiccopyright/
+ * @bug     8016099
+ * @summary Some SuppressWarnings annotations ignored ( unchecked, rawtypes )
+ * @compile UncheckedWarningRegressionTest.java
+ * @compile/fail/ref=UncheckedWarningRegressionTest.out -XDrawDiagnostics -Werror -Xlint:unchecked UncheckedWarningRegressionTest.java
+ */
+
+public class UncheckedWarningRegressionTest {
+    <T> void suppressedWarningsFinalInitializer() {
+        @SuppressWarnings("unchecked")
+        T[] tt = (T[]) FINAL_EMPTY_ARRAY;
+    }
+
+    final Object[] FINAL_EMPTY_ARRAY = {};
+
+    <T> void finalInitializer() {
+        T[] tt = (T[]) FINAL_EMPTY_ARRAY;
+    }
+
+    <T> void suppressedWarningsNonFinalInitializer() {
+        @SuppressWarnings("unchecked")
+        T[] tt = (T[]) NON_FINAL_EMPTY_ARRAY;
+    }
+
+    Object[] NON_FINAL_EMPTY_ARRAY = {};
+
+    <T> void nonFinalInitializer() {
+        T[] tt = (T[]) NON_FINAL_EMPTY_ARRAY;
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/tools/javac/T8016099/UncheckedWarningRegressionTest.out	Thu Jun 27 16:04:05 2013 +0100
@@ -0,0 +1,5 @@
+UncheckedWarningRegressionTest.java:18:24: compiler.warn.prob.found.req: (compiler.misc.unchecked.cast.to.type), java.lang.Object[], T[]
+UncheckedWarningRegressionTest.java:29:24: compiler.warn.prob.found.req: (compiler.misc.unchecked.cast.to.type), java.lang.Object[], T[]
+- compiler.err.warnings.and.werror
+1 error
+2 warnings