A proper WAT moment

John Colvin john.loughran.colvin at gmail.com
Mon Oct 14 17:00:56 UTC 2019


Different ability to access a property depending if I'm inside 
something else when I look?

struct S
{
     int a;
     static int b;
     int c() { return a; }
     static int d() { return 3; }
     int e() @property { return a; }
     static int f() @property { return 3; }
}

void foo(S s)
{
     pragma(msg, __LINE__, " ", __traits(compiles, 
__traits(getMember, s, "a")));
     pragma(msg, __LINE__, " ", __traits(compiles, 
__traits(getMember, S, "a")));

     pragma(msg, __LINE__, " ", __traits(compiles, 
__traits(getMember, s, "b")));
     pragma(msg, __LINE__, " ", __traits(compiles, 
__traits(getMember, S, "b")));

     pragma(msg, __LINE__, " ", __traits(compiles, 
__traits(getMember, s, "c")));
     pragma(msg, __LINE__, " ", __traits(compiles, 
__traits(getMember, S, "c")));

     pragma(msg, __LINE__, " ", __traits(compiles, 
__traits(getMember, s, "d")));
     pragma(msg, __LINE__, " ", __traits(compiles, 
__traits(getMember, S, "d")));

     pragma(msg, __LINE__, " ", __traits(compiles, 
__traits(getMember, s, "e")));
     pragma(msg, __LINE__, " ", __traits(compiles, 
__traits(getMember, S, "e")));

     pragma(msg, __LINE__, " ", __traits(compiles, 
__traits(getMember, s, "f")));
     pragma(msg, __LINE__, " ", __traits(compiles, 
__traits(getMember, S, "f")));
}

struct C(S)
{
     void foo(S s)
     {
         pragma(msg, __LINE__, " ", __traits(compiles, 
__traits(getMember, s, "a")));
         pragma(msg, __LINE__, " ", __traits(compiles, 
__traits(getMember, S, "a")));

         pragma(msg, __LINE__, " ", __traits(compiles, 
__traits(getMember, s, "b")));
         pragma(msg, __LINE__, " ", __traits(compiles, 
__traits(getMember, S, "b")));

         pragma(msg, __LINE__, " ", __traits(compiles, 
__traits(getMember, s, "c")));
         pragma(msg, __LINE__, " ", __traits(compiles, 
__traits(getMember, S, "c")));

         pragma(msg, __LINE__, " ", __traits(compiles, 
__traits(getMember, s, "d")));
         pragma(msg, __LINE__, " ", __traits(compiles, 
__traits(getMember, S, "d")));

         pragma(msg, __LINE__, " ", __traits(compiles, 
__traits(getMember, s, "e")));
         // ALL True except for this one:
         pragma(msg, __LINE__, " ", __traits(compiles, 
__traits(getMember, S, "e")));

         pragma(msg, __LINE__, " ", __traits(compiles, 
__traits(getMember, s, "f")));
         pragma(msg, __LINE__, " ", __traits(compiles, 
__traits(getMember, S, "f")));
     }
}

alias C0 = C!S;


More information about the Digitalmars-d-learn mailing list