| /* { dg-do run { target int32plus } } */ |
| /* { dg-options "-O2" } */ |
| |
| struct S0 |
| { |
| unsigned a : 15; |
| int b; |
| int c; |
| }; |
| |
| struct S1 |
| { |
| struct S0 s0; |
| int e; |
| }; |
| |
| struct Z |
| { |
| char c; |
| int z; |
| } __attribute__((packed)); |
| |
| union U |
| { |
| struct S1 s1; |
| struct Z z; |
| }; |
| |
| |
| int __attribute__((noinline, noclone)) |
| return_zero (void) |
| { |
| return 0; |
| } |
| |
| volatile union U gu; |
| struct S0 gs; |
| |
| int __attribute__((noinline, noclone)) |
| check_outcome () |
| { |
| if (gs.a != 6 |
| || gs.b != 80000) |
| __builtin_abort (); |
| } |
| |
| int |
| main (int argc, char *argv[]) |
| { |
| union U u; |
| struct S1 m; |
| struct S0 l; |
| |
| if (return_zero ()) |
| u.z.z = 20000; |
| else |
| { |
| u.s1.s0.a = 6; |
| u.s1.s0.b = 80000; |
| u.s1.e = 2; |
| |
| m = u.s1; |
| m.s0.c = 0; |
| l = m.s0; |
| gs = l; |
| } |
| |
| gu = u; |
| check_outcome (); |
| return 0; |
| } |