DMD 2.059: struct S{ immutable y = 1; } void main(){ writeln(S.y); // ok writeln(&S.y); // error with(S){ writeln(&y); // ok assert(*&y==y); // fail } } Either the code should run through or all the commented lines should fail to compile.
Better test case: struct S{ immutable y = 1; } void main(){ assert(S.y==1); // ok assert(&S.y!is null); // compile error with(S){ assert(&y!is null); // ok assert(*&y==y); // fail } }
Worse, the struct layout changes when an immutable field has an initializer. struct S { immutable int x = 1; int y; } struct S2 { int x; int y; } void main(){ S s; S2 s2; static assert(s.y.offsetof==s2.y.offsetof); // fails } Trying to take the address of s.x fails with 'not an lvalue', etc.
A better example: struct S { immutable int x = 1; int y; } struct S2 { immutable int x; int y; } void main(){ S s; S2 s2; static assert(s.y.offsetof==s2.y.offsetof); // fails }
Another case of Issue 3449 methinks. *** This issue has been marked as a duplicate of issue 3449 ***