annotate gcc/testsuite/gcc.dg/Wattributes-8.c @ 145:1830386684a0

gcc-9.2.0
author anatofuz
date Thu, 13 Feb 2020 11:34:05 +0900
parents 84e7813d76e9
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
131
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
1 /* PR middle-end/84108 - incorrect -Wattributes warning for packed/aligned
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
2 conflict on struct members
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
3 { dg-do compile }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
4 { dg-options "-Wall -Wattributes" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
5
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
6 #define ATTR(list) __attribute__ (list)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
7 #define ASSERT(e) _Static_assert (e, #e)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
8
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
9 /* GCC is inconsistent in how it treats attribute aligned between
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
10 variable and member declarations. Attribute aligned alone is
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
11 sufficient to reduce a variable's alignment requirement but
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
12 the attribute must be paired with packed to have the same
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
13 effect on a member. Worse, declaring a variable both aligned
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
14 and packed emits a warning. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
15
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
16 /* Avoid exercising this since emitting a warning for these given
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
17 the requirement for members seems like a misfeature:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
18 int a ATTR ((packed, aligned (2))); // -Wattributes
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
19 int b ATTR ((aligned (2), packed)); // -Wattributes
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
20 ASSERT (_Alignof (a) == 2);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
21 ASSERT (_Alignof (b) == 2); */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
22
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
23 int c ATTR ((aligned (2))); // okay (reduces alignment)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
24 ASSERT (_Alignof (c) == 2);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
25
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
26 struct {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
27 int a ATTR ((packed, aligned (2))); /* { dg-bogus "\\\[-Wattributes" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
28 int b ATTR ((aligned (2), packed)); /* { dg-bogus "\\\[-Wattributes" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
29
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
30 /* Avoid exercising this since the attribute has no effect yet
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
31 there is no warning.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
32 int c ATTR ((aligned (2))); // missing warning? */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
33 } s;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
34
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
35 ASSERT (_Alignof (s.a) == 2);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
36 ASSERT (_Alignof (s.b) == 2);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
37
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
38 /* ASSERT (_Alignof (s.c) == 4); */