38 lines
1.4 KiB
C
38 lines
1.4 KiB
C
/* 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" } */
|
|
int b ATTR ((aligned (2), packed)); /* { dg-bogus "\\\[-Wattributes" } */
|
|
|
|
/* 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); */
|