template instantiation problems

ag0aep6g anonymous at example.com
Fri Jan 10 18:31:59 UTC 2020


On 10.01.20 18:27, berni44 wrote:
> This clearly shows, that packageName is only instatiated once at top 
> level although mod0 and mod1 are two different things (at least their 
> stringof produces different results) and therefore should be 
> instantiated twice.
> 
> Now I don't know if this is a bug in DMD or I should know something I do 
> not know... Can you help me?

----
import m1 = foo.baz;
import m2 = foo;
alias p = __traits(parent, m1);

pragma(msg, m1.stringof); /* "module baz", ok */
pragma(msg, m2.stringof); /* "module foo", ok */
pragma(msg, p.stringof); /* "package foo", ok */

enum e(alias thing) = thing.stringof;

pragma(msg, e!m1); /* "module baz", ok */
pragma(msg, e!m2); /* "module foo", ok */
pragma(msg, e!p); /* "module foo", wat?? */
----

If you switch the last two lines around, you get "package foo" twice.

The compiler apparently thinks that m2 (module foo) and p (package foo) 
are the same thing when used as a template argument. So it reuses the 
previous result.

There's a similar issue with values:

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


More information about the Digitalmars-d-learn mailing list