Attributes not propagating to objects via typeinfo?

Steven Schveighoffer via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Thu Aug 13 08:59:21 PDT 2015


On 8/12/15 11:46 PM, rsw0x wrote:
> Sample code:
>
> class C{}
> struct S{}
>
> void main(){
>      import std.stdio;
>      auto c = new shared C();
>      auto s = new shared S();
>      writeln(typeid(c)); //modulename.C
>      writeln(typeid(s)); //shared(modulename.S)*
>      writeln(typeid(c).next); //null
>      writeln(typeid(s).next); //shared(modulename.S)
>      writeln(typeid(typeid(s).next) is typeid(TypeInfo_Shared)); //true
>      writeln(typeid(typeid(c)) is typeid(TypeInfo_Shared)); //false
> }
>
>
> What's the reason that the shared propagates to the typeinfo for the
> struct, but not for the class declaration?

That is definitely a bug. It's because typeid is looking up the derived 
type via the vtable, but the compiler should rewrap it with 'shared' 
afterwards.

This is enough to make me think it's a bug:

class C{}

void main(){
     auto c1 = new C;
     auto c2 = new shared(C);
     assert(typeid(c1) is typeid(c2));
     assert(!is(typeof(c1) == typeof(c2)));
     pragma(msg, typeof(c1)); // C
     pragma(msg, typeof(c2)); // shared(C)
}

I don't think it's shared-specific.

-Steve


More information about the Digitalmars-d-learn mailing list