import std.stdio; import std.traits; template A(T){ struct A{ T x; void foo(int z){} } } void main(){ enum b=A!int.init; auto c=A!int.init; writeln(fullyQualifiedName!(A!int.init)); writeln(fullyQualifiedName!(b)); writeln(fullyQualifiedName!(c)); } prints: T T tests.main.main.c is that normal to print T ?
Looks like this was caused by my pull https://github.com/D-Programming-Language/phobos/pull/1182 "(__traits(identifier, T)" is evaluated to "T" for some reasons with this snippet. On it.
Ok, there are two issues here. First one is that identifier trait fails badly with temporaries, minimal example: ---------------------------------------- template oops(alias T) { enum oops = __traits(identifier, T); } struct A {} pragma(msg, oops!(A.init)); void main() { } ---------------------------------------- Second looks like some sort of data reusage compiler bug - once identifier trait was called on a temporary, using it on normal symbols breaks too (yields same rersult).
I feel like I need an advice from someone from core DMD team on this - should I try to detect and workaround incoming temporaries in std.traits code or this is __traits(identifier) bug and need to be fixed in DMD itself?
Seems similar to https://issues.dlang.org/show_bug.cgi?id=12287
(In reply to Dicebot from comment #2) > Second looks like some sort of data reusage compiler bug - once identifier > trait was called on a temporary, using it on normal symbols breaks too > (yields same rersult). Filed that as issue 14501.
THIS ISSUE HAS BEEN MOVED TO GITHUB https://github.com/dlang/phobos/issues/9605 DO NOT COMMENT HERE ANYMORE, NOBODY WILL SEE IT, THIS ISSUE HAS BEEN MOVED TO GITHUB