diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Resolve.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Resolve.java index f3252f4818e1f..76c88cc9c7a24 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Resolve.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Resolve.java @@ -3111,7 +3111,8 @@ Pair resolveMemberReference(Env env, boundSearchResolveContext.methodCheck = methodCheck; Symbol boundSym = lookupMethod(boundEnv, env.tree.pos(), site.tsym, boundSearchResolveContext, boundLookupHelper); - ReferenceLookupResult boundRes = new ReferenceLookupResult(boundSym, boundSearchResolveContext); + boolean isStaticSelector = TreeInfo.isStaticSelector(referenceTree.expr, names); + ReferenceLookupResult boundRes = new ReferenceLookupResult(boundSym, boundSearchResolveContext, isStaticSelector); if (dumpMethodReferenceSearchResults) { dumpMethodReferenceSearchResults(referenceTree, boundSearchResolveContext, boundSym, true); } @@ -3127,7 +3128,7 @@ Pair resolveMemberReference(Env env, unboundSearchResolveContext.methodCheck = methodCheck; unboundSym = lookupMethod(unboundEnv, env.tree.pos(), site.tsym, unboundSearchResolveContext, unboundLookupHelper); - unboundRes = new ReferenceLookupResult(unboundSym, unboundSearchResolveContext); + unboundRes = new ReferenceLookupResult(unboundSym, unboundSearchResolveContext, isStaticSelector); if (dumpMethodReferenceSearchResults) { dumpMethodReferenceSearchResults(referenceTree, unboundSearchResolveContext, unboundSym, false); } @@ -3238,8 +3239,8 @@ static StaticKind reduce(StaticKind sk1, StaticKind sk2) { /** The lookup result. */ Symbol sym; - ReferenceLookupResult(Symbol sym, MethodResolutionContext resolutionContext) { - this(sym, staticKind(sym, resolutionContext)); + ReferenceLookupResult(Symbol sym, MethodResolutionContext resolutionContext, boolean isStaticSelector) { + this(sym, staticKind(sym, resolutionContext, isStaticSelector)); } private ReferenceLookupResult(Symbol sym, StaticKind staticKind) { @@ -3247,17 +3248,17 @@ private ReferenceLookupResult(Symbol sym, StaticKind staticKind) { this.sym = sym; } - private static StaticKind staticKind(Symbol sym, MethodResolutionContext resolutionContext) { - switch (sym.kind) { - case MTH: - case AMBIGUOUS: - return resolutionContext.candidates.stream() - .filter(c -> c.isApplicable() && c.step == resolutionContext.step) - .map(c -> StaticKind.from(c.sym)) - .reduce(StaticKind::reduce) - .orElse(StaticKind.UNDEFINED); - default: - return StaticKind.UNDEFINED; + private static StaticKind staticKind(Symbol sym, MethodResolutionContext resolutionContext, boolean isStaticSelector) { + if (sym.kind == MTH && !isStaticSelector) { + return StaticKind.from(sym); + } else if (sym.kind == MTH || sym.kind == AMBIGUOUS) { + return resolutionContext.candidates.stream() + .filter(c -> c.isApplicable() && c.step == resolutionContext.step) + .map(c -> StaticKind.from(c.sym)) + .reduce(StaticKind::reduce) + .orElse(StaticKind.UNDEFINED); + } else { + return StaticKind.UNDEFINED; } } diff --git a/test/langtools/tools/javac/lambda/methodReference/BoundUnboundSearchTest.java b/test/langtools/tools/javac/lambda/methodReference/BoundUnboundSearchTest.java index e5119f2c0b887..effce1a30afc3 100644 --- a/test/langtools/tools/javac/lambda/methodReference/BoundUnboundSearchTest.java +++ b/test/langtools/tools/javac/lambda/methodReference/BoundUnboundSearchTest.java @@ -132,5 +132,25 @@ public void test() { } """ ); + + assertOK( + getDiagConsumer(0, -1), + """ + import java.util.function.*; + + interface Intf { + Object apply(String... args); + } + + public class Test { + public static Object foo(Object o) { return "bar"; } + public final Object foo(Object... o) { return "foo"; } + + public void test() { + Intf f = this::foo; + } + } + """ + ); } }