Comment #0 by john.loughran.colvin — 2017-02-23T15:09:54Z
void foo(alias bar)()
{
static int bar0(T...)(T t) { return 0; }
alias bar = bar0;
import std.stdio;
writeln(bar(3));
}
int blah(T)(T t) { return 1; }
void main()
{
foo!blah;
}
currently this successfully compiles and prints 0. I think it should either fail to compile ("bar already defined") or print 1 as blah and bar0 form an overload set.
Comment #1 by john.loughran.colvin — 2017-02-23T15:18:07Z
One also gets this weirdness:
void foo(alias bar)()
{
static int bar0(T...)(T t) { return 0; }
alias bar = bar0;
pragma(msg, __traits(identifier, __traits(parent, bar!int)));
pragma(msg, __traits(identifier, __traits(parent, __traits(parent, bar!int))));
}
int blah(T)(T t) { return 1; }
void main()
{
foo!blah;
}
output:
bar0
bar0
I.e. __traits(parent, ...) ends up idempotent.
Comment #2 by robert.schadek — 2024-12-13T18:51:43Z