Templates with alias param instantiated with null cached by DMD..?

simendsjo simendsjo at gmail.com
Wed Oct 23 01:21:57 PDT 2013


On Wednesday, 23 October 2013 at 08:11:59 UTC, Kenji Hara wrote:
> On Wednesday, 23 October 2013 at 07:22:56 UTC, simendsjo wrote:
>> I've stumbled upon a strange bug, and I'm not sure what I 
>> should write in the bug report. Could someone explain what's 
>> going on here or file the bug for me?
>>
>> template A(alias T) {
>>    alias A = T;
>> }
>>
>> void main() {
>>    struct S1 { S1* p; }
>>    static assert(is(typeof(A!(S1.init.p)) == S1*)); // ok
>>
>>    pragma(msg, "NULL: ", typeof(A!(null))); // fail: S1*
>>
>>    struct S2 { S2* p; }
>>    static assert(is(typeof(A!(S2.init.p)) == S2*)); // fail: 
>> S1*
>> }
>
> A!(S1.init.p) is mostly same as A!( cast(S1*)null ), because 
> the expression S1.init.p is interpreted to a null value.
>
> 1. But current ABI does not support "a typed null template 
> value argument" because all of null expression on template 
> argument are mangled to 'n'. So the type of null value will be 
> never encoded in the mangled name, and the three instantiations 
> A!(S1.init.p), A!(null) and A!(S2.init.p) will have exactly 
> same mangling.
>
> 2. However, the first instantiation A!(S1.init.p) wrongly 
> caches the null value type (== S1*), and it appears in 
> following instantiations during semantic analysis phase.
>
> #2 is definitely a front-end bug. However I'm not sure the 
> current ABI definition issue (== #2) is a language spec bug or 
> not...
>
> Kenji Hara

Ok. Filed a bug. Probably not a good description, but I linked to 
your post: http://d.puremagic.com/issues/show_bug.cgi?id=11328


More information about the Digitalmars-d-learn mailing list