Clang Project

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