[Issue 10850] Inout substituted incorrectly for delegates/fptrs in inout function signature

via Digitalmars-d-bugs digitalmars-d-bugs at puremagic.com
Sat Sep 13 14:47:15 PDT 2014


https://issues.dlang.org/show_bug.cgi?id=10850

--- Comment #8 from Sobirari Muhomori <dfj1esp02 at sneakemail.com> ---
If different inout functions are independent:
---
inout(int)* delegate(inout(int)*) f(inout(int)* x)
{
    inout(int)* g(inout(int)* y) { return y; }
    //outer inout variables are seen as const
    //inout(int)* g(inout(int)* y) { return x; }
    int z;
    int* a = g(&z); //ok like any other inout function
    return &g;
}

void h()
{
    int x;
    //received true inout delegate
    inout(int)* delegate(inout(int)*) q = f(&x);
}
---


If inout is bound to the outer function:
---
inout(int)* delegate(inout(int)*) f(inout(int)* x)
{
    //work freely with local inout variables
    inout(int)* g(inout(int)* y) { return x; }
    int z;
    //int* a = g(&z); //can't convert mutable to inout
    return &g;
}

void r(inout(int)* x, inout(int)* delegate(inout(int)*) dg)
{
    dg(x);
}

void h()
{
    int x;
    //can't receive inout delegate
    int* delegate(int*) q = f(&x);

    //function can indirectly mutate its inout argument
    r(&x, (int* y){ ++*y; });
    assert(x==1);
}
---

Not sure, which is better.

--


More information about the Digitalmars-d-bugs mailing list