A compound literal without a storage class is not const
This one looks fixed by patches/508. The reproducer from the report: struct s { union { int a; int b; }; int c; int d; }; struct s s2 = { .a = 0, .c = 3, .d = 4 }; compiled to assembly against [r16747] and against [r16747] plus that patch set: port r16747 with patches/508 z80 warning 147 x2, data 0000 0000 0003 no warning, data 0000 0003 0004 stm8 same correct hc08 same correct s08 same correct mcs51 correct already correct The two warnings are the visible symptom; the data is the reason it matters....
This one looks fixed by patches/508. The reproducer from the report: struct s { union { int a; int b; }; int c; int d; }; struct s s2 = { .a = 0, .c = 3, .d = 4 }; compiled to assembly against r16747 and against r16747 plus that patch set: port r16747 with patches/508 z80 warning 147 x2, data 0000 0000 0003 no warning, data 0000 0003 0004 stm8 same correct hc08 same correct s08 same correct mcs51 correct already correct The two warnings are the visible symptom; the data is the reason it matters....
This looks fixed by patches/509, which addresses the same root cause from the other end: a compound literal in a declaration initializer is never given storage, so the temporary has no rname and the operand that reads it is emitted empty. Compiling the reproducer from this report to assembly, before and after that patch: port without patches/509 with it z80 ld hl, # (empty) correct z180 ld hl, # (empty) correct mcs51 mov ___memcpy_PARM_2,# correct stm8 correct correct That matches the workarounds...
Two regression-harness defects: TEST_PREFIX is inert, and a test's cases can be silently lost
A compound literal in a declaration initializer is never allocated
[r16733] fixes the reported case. Your commit message notes that it still fails when there are multiple structs with bitfields in the union — the case bug-3393.c carries under #if 0. 0001 of the set now on the patch tracker as patches/508 fixes that, and deletes the #if 0. On mcs51 the entire difference for struct S v = {1, 2, 3, 4} at file scope is one instruction: before: mov ((_gv + 0x0002) + 0),#0x04 ; the 4 lands at offset 2 -> c after: mov ((_gv + 0x0004) + 0),#0x04 ; the 4 lands at offset...
Anonymous-union initializers: six fixes for bug #3393