Don't use 'Candidate is' when there is more than one alias function overload (#14618)

* Fix Issue 23459 - Don't use 'Candidate is' when there is more than one alias function overload
This commit is contained in:
Nick Treleaven 2022-11-05 14:05:03 +00:00 committed by GitHub
parent 4731b401d7
commit 5e7e313a04
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 16 additions and 6 deletions

View file

@ -3357,7 +3357,20 @@ if (is(Decl == TemplateDeclaration) || is(Decl == FuncDeclaration))
// determine if the first candidate was printed
bool printed = false;
int count;
overloadApply(declaration, (Dsymbol s)
{
if (auto fd = s.isFuncDeclaration())
{
if (fd.errors || fd.type.ty == Terror)
return 0;
if (fd.storage_class & STC.disable || (fd.isDeprecated() && !showDeprecated))
return 0;
}
count++;
return count > 1; // early exit
});
const single_candidate = count == 1;
overloadApply(declaration, (Dsymbol s)
{
Dsymbol nextOverload;
@ -3373,7 +3386,6 @@ if (is(Decl == TemplateDeclaration) || is(Decl == FuncDeclaration))
if (fd.storage_class & STC.disable || (fd.isDeprecated() && !showDeprecated))
return 0;
const single_candidate = fd.overnext is null;
auto tf = cast(TypeFunction) fd.type;
.errorSupplemental(fd.loc,
printed ? " `%s%s`" :
@ -3390,8 +3402,6 @@ if (is(Decl == TemplateDeclaration) || is(Decl == FuncDeclaration))
const tmsg = td.toCharsNoConstraints();
const cmsg = td.getConstraintEvalError(constraintsTip);
const single_candidate = td.overnext is null;
// add blank space if there are multiple candidates
// the length of the blank space is `strlen("Candidates are: ")`

View file

@ -2,7 +2,7 @@
TEST_OUTPUT:
---
fail_compilation/diag14818.d(40): Error: none of the overloads of `func` are callable using argument types `(string)`
fail_compilation/diag14818.d(18): Candidate is: `diag14818.foo(int _param_0)`
fail_compilation/diag14818.d(18): Candidates are: `diag14818.foo(int _param_0)`
fail_compilation/diag14818.d(19): `diag14818.bar(double _param_0)`
fail_compilation/diag14818.d(41): Error: template instance `diag14818.X!string` does not match any template declaration
fail_compilation/diag14818.d(41): Candidates are:

View file

@ -3,7 +3,7 @@ TEST_OUTPUT:
---
fail_compilation/ice13459.d(12): Error: undefined identifier `B`
fail_compilation/ice13459.d(18): Error: none of the overloads of `opSlice` are callable using argument types `(int, int)`
fail_compilation/ice13459.d(11): Candidates are: `ice13459.A.opSlice()`
fail_compilation/ice13459.d(11): Candidate is: `ice13459.A.opSlice()`
---
*/
struct A