Comment #0 by verylonglogin.reg — 2011-10-13T02:01:46Z
Strange `tuple used as a type` error if using: template tuple parameter + named argument of its type + an constraint.
---
void f(int n)(int) { }
void f(U...)(U) { } // ok
void f(U...)(U a) { } // ok
void f(U...)(U) if(true) { } // ok
void f(U...)(U a) if(true) { } // Error: tuple U is used as a type
void main() { f!0(0); }
---
Comment #1 by k.hanazuki — 2011-10-26T12:47:11Z
Isn't this the correct behavior? -- U = 0 is not an type.
By the precedence of overload resolution, DMD does not instantiate some of the template function overloads and semantic errors are not reported for them.
If you define each template function alone, DMD(v2.056head) reports a "used as a type" error for it.
Comment #2 by verylonglogin.reg — 2011-10-27T02:38:23Z
dmd 2.056 now prints same error for both tuple templates with an constraint (so this bug is at least more consistent now).
P.S.
This is the full test code, I don't propose to define any function alone.