How is std.traits.isInstanceOf supposed to work?

Ali Çehreli acehreli at yahoo.com
Tue Nov 12 12:09:44 PST 2013


On 11/10/2013 05:03 PM, Tommi wrote:
> On Sunday, 10 November 2013 at 23:43:21 UTC, TheFlyingFiddle wrote:
>> The template isInstanceOf checks to see if the second parameter is a
>> template instantiation of the first parameter.
>
> But in this example of mine:
> isInstanceOf!(SuperSt, SubSt)
> ...the second parameter is not a template instantiation of the first
> parameter, yet isInstanceOf evaluates to true.
>
>
> I think what this all boils down to is that this is a compiler-bug:
>
> struct A(T)
> {}
>
> struct B
> {
>      A!int _a;
>      alias _a this;
> }
>
> void main()
> {
>      static assert(!is(B == A!int)); // OK
>      static assert(is(B == A!T, T)); // BUG (shouldn't compile)
> }

The compiler magically deduces T as int:

struct A(T)
{}

struct B
{
     A!int _a;
     alias _a this;
}

void main()
{
     static if (is(B == A!T, T)) {
         pragma(msg, T);    // prints int
     }
}

Ali



More information about the Digitalmars-d mailing list