8065219: Deprecated warning in method reference are missing in some cases

Reviewed-by: mcimadamore
This commit is contained in:
Srikanth Adayapalam 2015-10-07 16:02:57 +05:30
parent 1a5c52e6c3
commit 855243b12f
4 changed files with 59 additions and 5 deletions

View file

@ -3733,17 +3733,17 @@ public class Attr extends JCTree.Visitor {
" in tree " + tree); " in tree " + tree);
} }
// Test (1): emit a `deprecation' warning if symbol is deprecated. // Emit a `deprecation' warning if symbol is deprecated.
// (for constructors, the error was given when the constructor was // (for constructors (but not for constructor references), the error
// resolved) // was given when the constructor was resolved)
if (sym.name != names.init) { if (sym.name != names.init || tree.hasTag(REFERENCE)) {
chk.checkDeprecated(tree.pos(), env.info.scope.owner, sym); chk.checkDeprecated(tree.pos(), env.info.scope.owner, sym);
chk.checkSunAPI(tree.pos(), sym); chk.checkSunAPI(tree.pos(), sym);
chk.checkProfile(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. // kind are compatible with the prototype and protokind.
return check(tree, owntype, sym.kind.toSelector(), resultInfo); return check(tree, owntype, sym.kind.toSelector(), resultInfo);
} }

View file

@ -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;
}
}

View file

@ -0,0 +1,2 @@
- compiler.note.deprecated.filename: DeprecationSE8Test.java
- compiler.note.deprecated.recompile

View file

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