[Issue 16058] `immutable delegate()` and `immutable delegate() immutable` are considered equal but treated differently

d-bugmail at puremagic.com d-bugmail at puremagic.com
Tue Apr 13 00:25:17 UTC 2021


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

timon.gehr at gmx.ch changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |timon.gehr at gmx.ch

--- Comment #4 from timon.gehr at gmx.ch ---
(In reply to Kenji Hara from comment #3)
> From the type qualifier transitivity, immutable(int* delegate()) should be
> same with immutable(int* delegate() immutable).
> ...

This does not follow from transitivity because the postfix `immutable` also
annotates the implicit context parameter of the function pointer while the
`immutable` qualifier on the delegate a priori does not.

If those two types are conflated this actually leads to type system
unsoundness:

----
auto foo()pure{
    int x;
    return ()pure{ return x++; };
}

void main(){
    immutable dg=foo(); // can convert to immutable as it's a strongly pure
call
    import std.stdio;
    writeln(dg()," ",dg()); // 0 1, immutable context is modified
}
----

--


More information about the Digitalmars-d-bugs mailing list