Bug 9244 – union containing pointers not allowed

Status
RESOLVED
Resolution
FIXED
Severity
regression
Priority
P2
Component
dmd
Product
D
Version
D2
Platform
All
OS
All
Creation time
2012-12-29T20:40:00Z
Last change time
2013-02-01T14:11:56Z
Keywords
rejects-valid
Assigned to
nobody
Creator
rtcvb32

Comments

Comment #0 by rtcvb32 — 2012-12-29T20:40:55Z
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
Comment #1 by issues.dlang — 2012-12-29T23:03:21Z
If this is a regression, it needs to be marked as such.
Comment #2 by yebblies — 2013-01-14T03:49:46Z
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
Comment #3 by bugzilla — 2013-02-01T00:08:07Z
Comment #4 by github-bugzilla — 2013-02-01T14:07:06Z
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