# HG changeset patch # User vromero # Date 1506963862 25200 # Node ID 2e947e1bd907ec98e7cb829f2a673256a1cec0c8 # Parent a0116bcc65b70dcb5824bebc28034cb2cfe607de 8187978: javac can show overload error messages that include non-valid candidates Reviewed-by: mcimadamore Contributed-by: bsrbnd@gmail.com diff -r a0116bcc65b7 -r 2e947e1bd907 src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Resolve.java --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Resolve.java Mon Oct 02 12:29:44 2017 +0100 +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Resolve.java Mon Oct 02 10:04:22 2017 -0700 @@ -59,6 +59,7 @@ import java.util.HashSet; import java.util.Iterator; import java.util.LinkedHashMap; +import java.util.LinkedList; import java.util.Map; import java.util.Set; import java.util.function.BiFunction; @@ -4040,14 +4041,35 @@ } //where private Map mapCandidates() { - Map candidates = new LinkedHashMap<>(); + MostSpecificMap candidates = new MostSpecificMap(); for (Candidate c : resolveContext.candidates) { if (c.isApplicable()) continue; - candidates.put(c.sym, c.details); + candidates.put(c); } return candidates; } + @SuppressWarnings("serial") + private class MostSpecificMap extends LinkedHashMap { + private void put(Candidate c) { + ListBuffer overridden = new ListBuffer<>(); + for (Symbol s : keySet()) { + if (s == c.sym) { + continue; + } + if (c.sym.overrides(s, (TypeSymbol)s.owner, types, false)) { + overridden.add(s); + } else if (s.overrides(c.sym, (TypeSymbol)c.sym.owner, types, false)) { + return; + } + } + for (Symbol s : overridden) { + remove(s); + } + put(c.sym, c.details); + } + } + Map filterCandidates(Map candidatesMap) { Map candidates = new LinkedHashMap<>(); for (Map.Entry _entry : candidatesMap.entrySet()) { diff -r a0116bcc65b7 -r 2e947e1bd907 test/langtools/tools/javac/T8187978/FilterOutCandidatesForDiagnosticsTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/langtools/tools/javac/T8187978/FilterOutCandidatesForDiagnosticsTest.java Mon Oct 02 10:04:22 2017 -0700 @@ -0,0 +1,18 @@ +/* + * @test /nodynamiccopyright/ + * @bug 8187978 + * @summary javac can show overload error messages that include non-valid candidates + * @compile/fail/ref=FilterOutCandidatesForDiagnosticsTest.out -XDrawDiagnostics FilterOutCandidatesForDiagnosticsTest.java + */ + +import java.util.*; + +class FilterOutCandidatesForDiagnosticsTest { + void test() { + make(new ArrayList(), new ArrayList()).add(""); + } + + Z make(Z z1, Z z2) { + return null; + } +} diff -r a0116bcc65b7 -r 2e947e1bd907 test/langtools/tools/javac/T8187978/FilterOutCandidatesForDiagnosticsTest.out --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/langtools/tools/javac/T8187978/FilterOutCandidatesForDiagnosticsTest.out Mon Oct 02 10:04:22 2017 -0700 @@ -0,0 +1,2 @@ +FilterOutCandidatesForDiagnosticsTest.java:12:64: compiler.err.cant.apply.symbols: kindname.method, add, java.lang.String,{(compiler.misc.inapplicable.method: kindname.method, java.util.ArrayList, add(compiler.misc.type.captureof: 1, ? extends java.lang.Object&java.io.Serializable&java.lang.Comparable>,java.lang.Object[],int), (compiler.misc.arg.length.mismatch)),(compiler.misc.inapplicable.method: kindname.method, java.util.ArrayList, add(compiler.misc.type.captureof: 1, ? extends java.lang.Object&java.io.Serializable&java.lang.Comparable>), (compiler.misc.no.conforming.assignment.exists: (compiler.misc.inconvertible.types: java.lang.String, compiler.misc.type.captureof: 1, ? extends java.lang.Object&java.io.Serializable&java.lang.Comparable>))),(compiler.misc.inapplicable.method: kindname.method, java.util.ArrayList, add(int,compiler.misc.type.captureof: 1, ? extends java.lang.Object&java.io.Serializable&java.lang.Comparable>), (compiler.misc.arg.length.mismatch))} +1 error diff -r a0116bcc65b7 -r 2e947e1bd907 test/langtools/tools/javac/capture/Martin.out --- a/test/langtools/tools/javac/capture/Martin.out Mon Oct 02 12:29:44 2017 +0100 +++ b/test/langtools/tools/javac/capture/Martin.out Mon Oct 02 10:04:22 2017 -0700 @@ -1,2 +1,2 @@ -Martin.java:15:11: compiler.err.cant.apply.symbols: kindname.method, addAll, java.util.List,{(compiler.misc.inapplicable.method: kindname.method, java.util.Collection, addAll(java.util.Collection), (compiler.misc.no.conforming.assignment.exists: (compiler.misc.inconvertible.types: java.util.List, java.util.Collection))),(compiler.misc.inapplicable.method: kindname.method, java.util.List, addAll(java.util.Collection), (compiler.misc.no.conforming.assignment.exists: (compiler.misc.inconvertible.types: java.util.List, java.util.Collection))),(compiler.misc.inapplicable.method: kindname.method, java.util.List, addAll(int,java.util.Collection), (compiler.misc.arg.length.mismatch))} +Martin.java:15:11: compiler.err.cant.apply.symbols: kindname.method, addAll, java.util.List,{(compiler.misc.inapplicable.method: kindname.method, java.util.List, addAll(java.util.Collection), (compiler.misc.no.conforming.assignment.exists: (compiler.misc.inconvertible.types: java.util.List, java.util.Collection))),(compiler.misc.inapplicable.method: kindname.method, java.util.List, addAll(int,java.util.Collection), (compiler.misc.arg.length.mismatch))} 1 error diff -r a0116bcc65b7 -r 2e947e1bd907 test/langtools/tools/javac/lambda/8019480/T8019480.out --- a/test/langtools/tools/javac/lambda/8019480/T8019480.out Mon Oct 02 12:29:44 2017 +0100 +++ b/test/langtools/tools/javac/lambda/8019480/T8019480.out Mon Oct 02 10:04:22 2017 -0700 @@ -1,3 +1,3 @@ -T8019480.java:21:34: compiler.err.cant.apply.symbols: kindname.method, add, java.lang.Object,{(compiler.misc.inapplicable.method: kindname.method, java.util.Collection, add(U), (compiler.misc.no.conforming.assignment.exists: (compiler.misc.inconvertible.types: java.lang.Object, U))),(compiler.misc.inapplicable.method: kindname.method, java.util.List, add(U), (compiler.misc.no.conforming.assignment.exists: (compiler.misc.inconvertible.types: java.lang.Object, U))),(compiler.misc.inapplicable.method: kindname.method, java.util.List, add(int,U), (compiler.misc.arg.length.mismatch))} +T8019480.java:21:34: compiler.err.cant.apply.symbols: kindname.method, add, java.lang.Object,{(compiler.misc.inapplicable.method: kindname.method, java.util.List, add(U), (compiler.misc.no.conforming.assignment.exists: (compiler.misc.inconvertible.types: java.lang.Object, U))),(compiler.misc.inapplicable.method: kindname.method, java.util.List, add(int,U), (compiler.misc.arg.length.mismatch))} T8019480.java:21:46: compiler.err.report.access: clone(), protected, java.lang.Object 2 errors