www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 17239] New: template this in typeof expressions


          Issue ID: 17239
           Summary: template this in typeof expressions
           Product: D
           Version: D2
          Hardware: All
                OS: All
            Status: NEW
          Severity: major
          Priority: P1
         Component: dmd
          Assignee: nobody puremagic.com
          Reporter: john.loughran.colvin gmail.com

struct S
    int a;
    int b() { return a; }
     property int b(this X)() { return 2; }

pragma(msg, typeof(S.a));      // int
pragma(msg, typeof(S.b));      // int
pragma(msg, typeof(S.c));      // void

None of the expressions in the above typeofs can actually compile for real
(need `this` reference for `a`). However, the top two seem to be allowed but
the bottom isn't.

The makes it very painful to implement forwarding transparently (e.g.
std.typecons.Proxy / Typedef) because if you template on `this` in order to
handle shared/immutable/const then typeof expressions that worked for the
original type won't work for the wrapped type. This leaves you with method
duplication (x4: mutable, const, shared, shared const) as the only option.

Mar 02 2017