8065219: Deprecated warning in method reference are missing in some cases.
authorsadayapalam
Wed, 07 Oct 2015 16:02:57 +0530
changeset 32950 22315d47485b
parent 32949 7e0f345e64a8
child 32951 a098b538296c
8065219: Deprecated warning in method reference are missing in some cases. Reviewed-by: mcimadamore
langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java
langtools/test/tools/javac/warnings/DeprecationSE8Test.java
langtools/test/tools/javac/warnings/DeprecationSE8Test.noLint.out
langtools/test/tools/javac/warnings/DeprecationSE8Test.out
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java	Wed Oct 07 15:53:38 2015 +0530
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java	Wed Oct 07 16:02:57 2015 +0530
@@ -3733,17 +3733,17 @@
                                          " in tree " + tree);
             }
 
-            // Test (1): emit a `deprecation' warning if symbol is deprecated.
-            // (for constructors, the error was given when the constructor was
-            // resolved)
-
-            if (sym.name != names.init) {
+            // Emit a `deprecation' warning if symbol is deprecated.
+            // (for constructors (but not for constructor references), the error
+            // was given when the constructor was resolved)
+
+            if (sym.name != names.init || tree.hasTag(REFERENCE)) {
                 chk.checkDeprecated(tree.pos(), env.info.scope.owner, sym);
                 chk.checkSunAPI(tree.pos(), sym);
                 chk.checkProfile(tree.pos(), sym);
             }
 
-            // Test (3): if symbol is a variable, check that its type and
+            // If symbol is a variable, check that its type and
             // kind are compatible with the prototype and protokind.
             return check(tree, owntype, sym.kind.toSelector(), resultInfo);
         }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/warnings/DeprecationSE8Test.java	Wed Oct 07 16:02:57 2015 +0530
@@ -0,0 +1,47 @@
+/**
+ * @test  /nodynamiccopyright/
+ * @bug 8065219
+ * @summary Deprecated warning in method reference are missing in some cases.
+ * @compile/ref=DeprecationSE8Test.noLint.out -XDrawDiagnostics DeprecationSE8Test.java
+ * @compile/ref=DeprecationSE8Test.out -Xlint:deprecation,-options -source 8 -XDrawDiagnostics DeprecationSE8Test.java
+ */
+
+
+class DeprecationSE8Test {
+    @FunctionalInterface
+    interface I {
+        DeprecationSE8Test meth();
+    }
+
+    @FunctionalInterface
+    interface J {
+        int meth();
+    }
+
+    @Deprecated
+    public DeprecationSE8Test() {
+    }
+
+    @Deprecated
+    public static int foo() {
+        return 1;
+    }
+
+    // Using deprecated entities from within one's own top level class does not merit warning.
+    void notBadUsages() {
+        I i = DeprecationSE8Test::new;
+        new DeprecationSE8Test();
+        J j = DeprecationSE8Test::foo;
+        foo();
+    }
+}
+
+class DeprecationSE8_01 {
+    // Using deprecated entities from outside one's own top level class deserves warning.
+    void badUsages() {
+        DeprecationSE8Test.I i = DeprecationSE8Test::new;
+        new DeprecationSE8Test();
+        DeprecationSE8Test.foo();
+        DeprecationSE8Test.J j = DeprecationSE8Test::foo;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/warnings/DeprecationSE8Test.noLint.out	Wed Oct 07 16:02:57 2015 +0530
@@ -0,0 +1,2 @@
+- compiler.note.deprecated.filename: DeprecationSE8Test.java
+- compiler.note.deprecated.recompile
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/warnings/DeprecationSE8Test.out	Wed Oct 07 16:02:57 2015 +0530
@@ -0,0 +1,5 @@
+DeprecationSE8Test.java:42:34: compiler.warn.has.been.deprecated: DeprecationSE8Test(), DeprecationSE8Test
+DeprecationSE8Test.java:43:9: compiler.warn.has.been.deprecated: DeprecationSE8Test(), DeprecationSE8Test
+DeprecationSE8Test.java:44:27: compiler.warn.has.been.deprecated: foo(), DeprecationSE8Test
+DeprecationSE8Test.java:45:34: compiler.warn.has.been.deprecated: foo(), DeprecationSE8Test
+4 warnings