| /* PR middle-end/84108 - incorrect -Wattributes warning for packed/aligned |
| conflict on struct members |
| { dg-do compile } |
| { dg-options "-Wall -Wattributes" } */ |
| |
| #define ATTR(list) __attribute__ (list) |
| #define ASSERT(e) _Static_assert (e, #e) |
| |
| /* GCC is inconsistent in how it treats attribute aligned between |
| variable and member declarations. Attribute aligned alone is |
| sufficient to reduce a variable's alignment requirement but |
| the attribute must be paired with packed to have the same |
| effect on a member. Worse, declaring a variable both aligned |
| and packed emits a warning. */ |
| |
| /* Avoid exercising this since emitting a warning for these given |
| the requirement for members seems like a misfeature: |
| int a ATTR ((packed, aligned (2))); // -Wattributes |
| int b ATTR ((aligned (2), packed)); // -Wattributes |
| ASSERT (_Alignof (a) == 2); |
| ASSERT (_Alignof (b) == 2); */ |
| |
| int c ATTR ((aligned (2))); // okay (reduces alignment) |
| ASSERT (_Alignof (c) == 2); |
| |
| struct { |
| int a ATTR ((packed, aligned (2))); /* { dg-bogus "\\\[-Wattributes" "" { target { ! default_packed } } } */ |
| /* { dg-warning "attribute ignored" "" { target { default_packed } } .-1 } */ |
| int b ATTR ((aligned (2), packed)); /* { dg-bogus "\\\[-Wattributes" "" { target { ! default_packed } } } */ |
| /* { dg-warning "attribute ignored" "" { target { default_packed } } .-1 } */ |
| |
| /* Avoid exercising this since the attribute has no effect yet |
| there is no warning. |
| int c ATTR ((aligned (2))); // missing warning? */ |
| } s; |
| |
| ASSERT (_Alignof (s.a) == 2); |
| ASSERT (_Alignof (s.b) == 2); |
| |
| /* ASSERT (_Alignof (s.c) == 4); */ |