1 /* PR middle-end/81824 - Warn for missing attributes with function aliases
2    Exercise attribute copy for types.
3    { dg-do compile }
4    { dg-options "-O2 -Wall -ftrack-macro-expansion=0" } */
5 
6 #define Assert(expr)   typedef char AssertExpr[2 * !!(expr) - 1]
7 
8 #define ATTR(list)   __attribute__ (list)
9 
10 /* Use attribute packed to verify that type attributes are copied
11    from one type to another.  */
12 
13 struct ATTR ((packed)) PackedA { int i; char c; };
14 
15 Assert (__alignof (struct PackedA) == 1);
16 
17 struct ATTR ((copy ((struct PackedA*)0))) PackedB { long i; char c; };
18 
19 Assert (__alignof (struct PackedA) == __alignof (struct PackedB));
20 
21 struct PackedMember
22 {
23   char c;
24   ATTR ((copy ((struct PackedB*)0))) double packed_mem;
25   /* { dg-warning "attribute ignored" "" { target default_packed } .-1 } */
26 };
27 
28 Assert (__alignof (struct PackedMember) == 1);
29 
30 
31 extern const struct PackedA packed;
32 
33 struct Unpacked { int i; char c; };
34 Assert (__alignof (struct Unpacked) > 1);
35 /* { dg-error "size of array .* is negative" "" { target default_packed } .-1 } */
36 
37 /* Verify that copying the packed attribute to the declaration
38    of an object is ignored with a warning.  (There should be
39    a way to copy just the subset of attributes from a type that
40    aren't ignored and won't cause a warning, maybe via attribute
41    copy_except or something like that.)  */
42 extern ATTR ((copy ((struct PackedA*)0))) const struct Unpacked
43   unpacked;                   /* { dg-warning ".packed. attribute ignored" } */
44 
45 Assert (__alignof (packed) == 1);
46 Assert (__alignof (unpacked) == __alignof (struct Unpacked));
47 
48 
49 
50 /* Verify that attribute deprecated isn't copied (but referencing
51    the deprecated type in the copy attribute still triggers a warning).  */
52 
53 struct ATTR ((aligned (8), deprecated))
54 AlignedDeprecated { char c; };
55 
56 struct ATTR ((copy ((struct AlignedDeprecated *)0)))        /* { dg-warning "\\\[-Wdeprecated-declarations]" } */
57 AlignedCopy { short s; };
58 
59 Assert (__alignof (struct AlignedCopy) == 8);
60 
61 struct AlignedCopy aligned_copy;
62 
63 Assert (__alignof (aligned_copy) == 8);
64