Show nested template function signature in candidate message (#16827)

Part of Bugzilla 20713 - Improve Template Deduction Error Message Given Template Parameter Default Values
This commit is contained in:
Nick Treleaven 2024-09-05 01:33:34 +01:00 committed by GitHub
parent 6a79518936
commit 855521dd86
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 23 additions and 2 deletions

View file

@ -1799,13 +1799,16 @@ if (is(Decl == TemplateDeclaration) || is(Decl == FuncDeclaration))
if (!print)
return true;
// if td.onemember is a function, toCharsMaybeConstraints can print it
// without us recursing, otherwise we have to handle it.
// td.onemember may not have overloads set
// (see fail_compilation/onemember_overloads.d)
// assume if more than one member it is overloaded internally
bool recurse = td.onemember && td.members.length > 1;
bool recurse = td.onemember && (!td.onemember.isFuncDeclaration ||
td.members.length > 1);
OutBuffer buf;
HdrGenState hgs;
hgs.skipConstraints = true;
hgs.skipConstraints = true; // failing constraint should get printed below
hgs.showOneMember = !recurse;
toCharsMaybeConstraints(td, buf, hgs);
const tmsg = buf.peekChars();

View file

@ -0,0 +1,18 @@
/*
TEST_OUTPUT:
---
fail_compilation/nested_template_constraint.d(17): Error: template `foo` is not callable using argument types `!()(string, int)`
fail_compilation/nested_template_constraint.d(10): Candidate is: `foo(int x = 0)`
fail_compilation/nested_template_constraint.d(11): - Containing: `foo(T, U)(T t, U u)`
---
*/
template foo(int x = 0) {
void foo(T, U)(T t, U u)
if (is(T == int) && is(U == int)) {}
}
void main()
{
foo("hello", 4);
}