[Issue 23897] New: Bad diagnostic "none of the overloads of template" for lamdba

d-bugmail at puremagic.com d-bugmail at puremagic.com
Sat May 6 16:11:04 UTC 2023


https://issues.dlang.org/show_bug.cgi?id=23897

          Issue ID: 23897
           Summary: Bad diagnostic "none of the overloads of template" for
                    lamdba
           Product: D
           Version: D2
          Hardware: All
                OS: All
            Status: NEW
          Keywords: diagnostic
          Severity: regression
          Priority: P4
         Component: dmd
          Assignee: nobody at puremagic.com
          Reporter: dlang-bugzilla at thecybershadow.net

/////////// test.d ///////////
void main()
{
    alias f = (a, b) => a + b;
    f(1);
}
//////////////////////////////

Since 2.099.0, the above fails to compile with:

test.d(4): Error: none of the overloads of template `D main.__lambda1` are
callable using argument types `!()(int)`
test.d(3):        Candidate is: `__lambda1`

There are two problems here:

1. There are no overloads; any overloads here were fabricated by the compiler.
These internal changes should be hidden from the user.

2. The diagnostic is not very helpful in identifying the problem. It does not
print any information about the template whose arguments are not being matched.

If we rewrite the program to use a more backwards compatible syntax:

//////////////////// test2.d ///////////////////
template Identity(T...) { alias T[0] Identity; }

void main()
{
    alias Identity!((a, b) { return a + b; }) f;
    f(1);
}
////////////////////////////////////////////////

then we see older compilers emit a more useful error message. 2.064 produces:

test2.d(6): Error: template D main.__lambda1 does not match any function
template declaration. Candidates are:
test2.d(5):        test2.main.__lambda1(__T1, __T2)(a, b)
test2.d(6): Error: template test2.main.__lambda1(__T1, __T2)(a, b) cannot
deduce template function from argument types !()(int)

Especially the last line is very useful, and is missing entirely from new
compilers.

Last line disappeared in: https://github.com/dlang/dmd/pull/3020
The misleading "overload" diagnostic was introduced in:
https://github.com/dlang/dmd/pull/13544

--


More information about the Digitalmars-d-bugs mailing list