xref: /aosp_15_r20/external/clang/test/Sema/struct-packed-align.c (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 %s -fsyntax-only -verify
2*67e74705SXin Li // RUN: %clang_cc1 %s -fsyntax-only -triple=x86_64-windows-coff -verify
3*67e74705SXin Li 
4*67e74705SXin Li // Packed structs.
5*67e74705SXin Li struct s {
6*67e74705SXin Li     char a;
7*67e74705SXin Li     int b  __attribute__((packed));
8*67e74705SXin Li     char c;
9*67e74705SXin Li     int d;
10*67e74705SXin Li };
11*67e74705SXin Li 
12*67e74705SXin Li extern int a1[sizeof(struct s) == 12 ? 1 : -1];
13*67e74705SXin Li extern int a2[__alignof(struct s) == 4 ? 1 : -1];
14*67e74705SXin Li 
15*67e74705SXin Li struct __attribute__((packed)) packed_s {
16*67e74705SXin Li     char a;
17*67e74705SXin Li     int b  __attribute__((packed));
18*67e74705SXin Li     char c;
19*67e74705SXin Li     int d;
20*67e74705SXin Li };
21*67e74705SXin Li 
22*67e74705SXin Li extern int b1[sizeof(struct packed_s) == 10 ? 1 : -1];
23*67e74705SXin Li extern int b2[__alignof(struct packed_s) == 1 ? 1 : -1];
24*67e74705SXin Li 
25*67e74705SXin Li struct fas {
26*67e74705SXin Li     char a;
27*67e74705SXin Li     int b[];
28*67e74705SXin Li };
29*67e74705SXin Li 
30*67e74705SXin Li extern int c1[sizeof(struct fas) == 4 ? 1 : -1];
31*67e74705SXin Li extern int c2[__alignof(struct fas) == 4 ? 1 : -1];
32*67e74705SXin Li 
33*67e74705SXin Li struct __attribute__((packed)) packed_fas {
34*67e74705SXin Li     char a;
35*67e74705SXin Li     int b[];
36*67e74705SXin Li };
37*67e74705SXin Li 
38*67e74705SXin Li extern int d1[sizeof(struct packed_fas) == 1 ? 1 : -1];
39*67e74705SXin Li extern int d2[__alignof(struct packed_fas) == 1 ? 1 : -1];
40*67e74705SXin Li 
41*67e74705SXin Li struct packed_after_fas {
42*67e74705SXin Li     char a;
43*67e74705SXin Li     int b[];
44*67e74705SXin Li } __attribute__((packed));
45*67e74705SXin Li 
46*67e74705SXin Li extern int d1_2[sizeof(struct packed_after_fas) == 1 ? 1 : -1];
47*67e74705SXin Li extern int d2_2[__alignof(struct packed_after_fas) == 1 ? 1 : -1];
48*67e74705SXin Li 
49*67e74705SXin Li // Alignment
50*67e74705SXin Li 
51*67e74705SXin Li struct __attribute__((aligned(8))) as1 {
52*67e74705SXin Li     char c;
53*67e74705SXin Li };
54*67e74705SXin Li 
55*67e74705SXin Li extern int e1[sizeof(struct as1) == 8 ? 1 : -1];
56*67e74705SXin Li extern int e2[__alignof(struct as1) == 8 ? 1 : -1];
57*67e74705SXin Li 
58*67e74705SXin Li struct __attribute__((aligned)) as1_2 {
59*67e74705SXin Li     char c;
60*67e74705SXin Li };
61*67e74705SXin Li #ifdef __s390x__
62*67e74705SXin Li extern int e1_2[sizeof(struct as1_2) == 8 ? 1 : -1];
63*67e74705SXin Li extern int e2_2[__alignof(struct as1_2) == 8 ? 1 : -1];
64*67e74705SXin Li #else
65*67e74705SXin Li extern int e1_2[sizeof(struct as1_2) == 16 ? 1 : -1];
66*67e74705SXin Li extern int e2_2[__alignof(struct as1_2) == 16 ? 1 : -1];
67*67e74705SXin Li #endif
68*67e74705SXin Li 
69*67e74705SXin Li struct as2 {
70*67e74705SXin Li     char c;
71*67e74705SXin Li     int __attribute__((aligned(8))) a;
72*67e74705SXin Li };
73*67e74705SXin Li 
74*67e74705SXin Li extern int f1[sizeof(struct as2) == 16 ? 1 : -1];
75*67e74705SXin Li extern int f2[__alignof(struct as2) == 8 ? 1 : -1];
76*67e74705SXin Li 
77*67e74705SXin Li struct __attribute__((packed)) as3 {
78*67e74705SXin Li     char c;
79*67e74705SXin Li     int a;
80*67e74705SXin Li     int __attribute__((aligned(8))) b;
81*67e74705SXin Li };
82*67e74705SXin Li 
83*67e74705SXin Li extern int g1[sizeof(struct as3) == 16 ? 1 : -1];
84*67e74705SXin Li extern int g2[__alignof(struct as3) == 8 ? 1 : -1];
85*67e74705SXin Li 
86*67e74705SXin Li 
87*67e74705SXin Li // rdar://5921025
88*67e74705SXin Li struct packedtest {
89*67e74705SXin Li   int ted_likes_cheese;
90*67e74705SXin Li   void *args[] __attribute__((packed));
91*67e74705SXin Li };
92*67e74705SXin Li 
93*67e74705SXin Li // Packed union
94*67e74705SXin Li union __attribute__((packed)) au4 {char c; int x;};
95*67e74705SXin Li extern int h1[sizeof(union au4) == 4 ? 1 : -1];
96*67e74705SXin Li extern int h2[__alignof(union au4) == 1 ? 1 : -1];
97*67e74705SXin Li 
98*67e74705SXin Li // Aligned union
99*67e74705SXin Li union au5 {__attribute__((aligned(4))) char c;};
100*67e74705SXin Li extern int h1[sizeof(union au5) == 4 ? 1 : -1];
101*67e74705SXin Li extern int h2[__alignof(union au5) == 4 ? 1 : -1];
102*67e74705SXin Li 
103*67e74705SXin Li // Alignment+packed
104*67e74705SXin Li struct as6 {char c; __attribute__((packed, aligned(2))) int x;};
105*67e74705SXin Li extern int i1[sizeof(struct as6) == 6 ? 1 : -1];
106*67e74705SXin Li extern int i2[__alignof(struct as6) == 2 ? 1 : -1];
107*67e74705SXin Li 
108*67e74705SXin Li union au6 {char c; __attribute__((packed, aligned(2))) int x;};
109*67e74705SXin Li extern int k1[sizeof(union au6) == 4 ? 1 : -1];
110*67e74705SXin Li extern int k2[__alignof(union au6) == 2 ? 1 : -1];
111*67e74705SXin Li 
112*67e74705SXin Li // Check postfix attributes
113*67e74705SXin Li union au7 {char c; int x;} __attribute__((packed));
114*67e74705SXin Li extern int l1[sizeof(union au7) == 4 ? 1 : -1];
115*67e74705SXin Li extern int l2[__alignof(union au7) == 1 ? 1 : -1];
116*67e74705SXin Li 
117*67e74705SXin Li struct packed_fas2 {
118*67e74705SXin Li     char a;
119*67e74705SXin Li     int b[];
120*67e74705SXin Li } __attribute__((packed));
121*67e74705SXin Li 
122*67e74705SXin Li extern int m1[sizeof(struct packed_fas2) == 1 ? 1 : -1];
123*67e74705SXin Li extern int m2[__alignof(struct packed_fas2) == 1 ? 1 : -1];
124*67e74705SXin Li 
125*67e74705SXin Li // Attribute aligned can round down typedefs.  PR9253
126*67e74705SXin Li typedef long long  __attribute__((aligned(1))) nt;
127*67e74705SXin Li 
128*67e74705SXin Li struct nS {
129*67e74705SXin Li   char buf_nr;
130*67e74705SXin Li   nt start_lba;
131*67e74705SXin Li };
132*67e74705SXin Li 
133*67e74705SXin Li #if defined(_WIN32) && !defined(__declspec) // _MSC_VER is unavailable in cc1.
134*67e74705SXin Li // Alignment doesn't affect packing in MS mode.
135*67e74705SXin Li extern int n1[sizeof(struct nS) == 16 ? 1 : -1];
136*67e74705SXin Li extern int n2[__alignof(struct nS) == 8 ? 1 : -1];
137*67e74705SXin Li #else
138*67e74705SXin Li extern int n1[sizeof(struct nS) == 9 ? 1 : -1];
139*67e74705SXin Li extern int n2[__alignof(struct nS) == 1 ? 1 : -1];
140*67e74705SXin Li #endif
141*67e74705SXin Li 
142*67e74705SXin Li // Packed attribute shouldn't be ignored for bit-field of char types.
143*67e74705SXin Li // Note from GCC reference manual: The 4.1, 4.2 and 4.3 series of GCC ignore
144*67e74705SXin Li // the packed attribute on bit-fields of type char. This has been fixed in
145*67e74705SXin Li // GCC 4.4 but the change can lead to differences in the structure layout.
146*67e74705SXin Li // See the documentation of -Wpacked-bitfield-compat for more information.
147*67e74705SXin Li struct packed_chars {
148*67e74705SXin Li   char a:4;
149*67e74705SXin Li   char b:8 __attribute__ ((packed));
150*67e74705SXin Li   // expected-warning@-1 {{'packed' attribute was ignored on bit-fields with single-byte alignment in older versions of GCC and Clang}}
151*67e74705SXin Li   char c:4;
152*67e74705SXin Li };
153*67e74705SXin Li 
154*67e74705SXin Li #if defined(_WIN32) && !defined(__declspec) // _MSC_VER is unavailable in cc1.
155*67e74705SXin Li // On Windows clang uses MSVC compatible layout in this case.
156*67e74705SXin Li extern int o1[sizeof(struct packed_chars) == 3 ? 1 : -1];
157*67e74705SXin Li extern int o2[__alignof(struct packed_chars) == 1 ? 1 : -1];
158*67e74705SXin Li #else
159*67e74705SXin Li extern int o1[sizeof(struct packed_chars) == 2 ? 1 : -1];
160*67e74705SXin Li extern int o2[__alignof(struct packed_chars) == 1 ? 1 : -1];
161*67e74705SXin Li #endif
162