Silently enters 'void* this;' pointer making compiling error out. Current beta (v2.061, windows 32bit) Only by using traits will the problem show itself. [code] static assert(__traits(compiles, { union xxx { int i; //bitfields will make such functions... mixin("int geti() @safe const nothrow pure {return i;}void seti(int ii) @safe pure nothrow {i = ii;}"); } })); [/code] output: test.d(??): Error: static assert (__traits(compiles,delegate pure nothrow @safe void() { union xxx { int i; mixin("int geti() @safe const nothrow pure {return i;}void seti(int ii) @safe pure nothrow {i = ii;}"); void* this; } } )) is false
If this is a regression, it needs to be marked as such.
Reduced: void main() { union U { int i; @safe int x() { return i; } } } Because U has a function in it, dmd incorrectly decides it is a nested union and (even worse) inserts a void* member. A regression because: - @safe code didn't always disallow unions with pointers - wrapping x in an attribute such as @safe used to make the compiler infer U as non-nested Workaround: make U static
https://github.com/D-Programming-Language/dmd/pull/1591
Commits pushed to master at https://github.com/D-Programming-Language/dmd https://github.com/D-Programming-Language/dmd/commit/0e21647a30c50e02e4a9ce43ee7e891a41d7c255 fix Issue 9244 - union containing pointers not allowed https://github.com/D-Programming-Language/dmd/commit/95a3f5ff979f40ff0e7ae459b8d9786d64f901a7 Merge pull request #1591 from WalterBright/b46 fix Issue 9244 - union containing pointers not allowed