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

          Issue ID: 19363
           Summary: Manifest constant delegates are mutable
           Product: D
           Version: D2
          Hardware: x86
                OS: Windows
            Status: NEW
          Severity: enhancement
          Priority: P1
         Component: dmd
          Assignee: nob...@puremagic.com
          Reporter: cont...@lngnslnvsk.net

The compiler does not check whether the function used to form a delegate
mutates its context or not when declaring a manifest constant.

This should not work:
```
class C
{
        int member;
        int foo()
        {
                member++;
                return 123 + member;
        }
}

enum u = &(new C().foo);

void main()
{
    import std.stdio : writeln;
    writeln(u());       // 124
        writeln(u());   // 125
        writeln(u());   // 126
        writeln(u());   // 127
}
```

This was found by this user:
https://forum.dlang.org/post/cfjftxwgnlaovaolb...@forum.dlang.org

The expected behavior would be the statement `enum u = &(new C().foo);` failing
for the expression `&(new C().foo)` is not constant, akin to assigning to
const.

`const u = &(new C().foo);` => `Error: expression &C(0).foo is not a constant`

--

Reply via email to