Bug 7362 – forward referenced inner struct with align(1) doesn't add to offset of next field when used inside a union of another struct, that is nested in the same outer struct
Status
RESOLVED
Resolution
FIXED
Severity
minor
Priority
P2
Component
dmd
Product
D
Version
D2
Platform
All
OS
Linux
Creation time
2012-01-24T10:49:00Z
Last change time
2015-06-09T04:41:31Z
Keywords
wrong-code
Assigned to
nobody
Creator
Marco.Leise
Comments
Comment #0 by Marco.Leise — 2012-01-24T10:49:06Z
This happened to me when I designed data structures for CD sectors, and used an outer struct to wrap all the different sector layouts (Mode1/2 CDs, ...). The short code below is more suited for a unittest:
struct Outer {
struct Inner1 {
union {
Inner2 a;
}
byte I_AM_AT_THE_WRONG_OFFSET;
}
align(1) struct Inner2 {
ubyte x;
}
}
void main() {
writeln(Outer.Inner1.I_AM_AT_THE_WRONG_OFFSET.offsetof);
}
This prints '0', which means that field 'I_AM_AT_THE_WRONG_OFFSET' wasn't correctly offset behind field 'a'. It works correctly when
a) align(1) is removed
b) Inner2 is declared before Inner1
c) 'a' is not inside a union block
Comment #1 by lovelydear — 2012-04-19T14:44:01Z
Returns 1 on Win32 2.059
Comment #2 by Marco.Leise — 2012-04-20T08:55:45Z
Yes, it has been fixed in the mean time. Add this to the solved bugs for 2.059!