Template expansion bug?

Steven Schveighoffer schveiguy at yahoo.com
Fri May 31 07:42:32 PDT 2013


While doing some testing, I came across this behavior:

template foo(T) {
     void foo() {}
}

void main()
{
     foo!(int).foo();
     //foo!(int)(); // this works
}

Error:
testbug.d(7): Error: template testbug.foo does not match any function  
template declaration. Candidates are:
testbug.d(1):        testbug.foo(T)()
testbug.d(7): Error: template testbug.foo(T)() cannot deduce template  
function from argument types !()(void)

This happens on 2.063 and 2.061.

 From D spec: http://dlang.org/template.html

If a template has exactly one member in it, and the name of that member is  
the same as the template name, that member is assumed to be referred to in  
a template instantiation:

template Foo(T) {
   T Foo; // declare variable Foo of type T
}

void test() {
   Foo!(int) = 6; // instead of Foo!(int).Foo
}

...



I would have expected that foo!(int).foo() is equivalent to foo!(int)().   
Is this no longer the case?  Is there some issue here with DMD  
aggressively evaluating foo!(int) to be a call because of the no-arg  
function?

Actually, it does seem that way, if I change foo to accept a parameter,  
and call:

foo!(int).foo(1);

I get:

testbug.d(7): Error: foo (int t) is not callable using argument types ()
testbug.d(7): Error: foo (int t) is not callable using argument types ()

(and yes, double the error).

I can't at the moment think of a reason why anyone would ever use the full  
syntax, but I would expect it to be accessible, and for the compiler to  
treat foo as a template first, function call second.

-Steve


More information about the Digitalmars-d mailing list