Issue ID: 17744
           Summary: Type system hole: returning inout delegates
           Product: D
           Version: D2
          Hardware: All
                OS: All
            Status: NEW
          Severity: critical
          Priority: P1
         Component: dmd

DMD v2.075.0:

int a;
immutable(int) b=2;

inout(int)* delegate(inout(int)*)@safe delegate()@safe foo(inout(int)* y){
    inout(int)* bar(inout(int)* p){
        return y;
    return ()=>&bar;
void main(){
    int* y=foo(&b)()(&a);
    assert(&b is y); // passes. ouch.
    assert(b is *&b); // fails!

If &bar is returned directly instead of ()=>&bar, DMD applies a strange
work-around (it replaces `inout` in the returned delegate by `const`).


Reply via email to