[clang] Implement lifetime analysis for lifetime_capture_by(X) (#115921)
[llvm-project.git] / clang / test / Sema / test-wunaligned-access.c
blob4680ff4cf19c0da863c9fbfa62e7da87338eb7aa
1 // RUN: %clang_cc1 %s -triple=armv7-none-none-eabi -verify -Wunaligned-access -emit-llvm -o %t
2 // REQUIRES: arm-registered-target
3 //
4 // This test suite tests the warning triggered by the -Wunaligned-access option.
5 // The warning occurs when a struct or other type of record contains a field
6 // that is itself a record. The outer record must be a packed structure, while
7 // while the inner record must be unpacked. This is the fundamental condition
8 // for the warning to be triggered. Some of these tests may have three layers.
9 //
10 // The command line option -fsyntax-only is not used as Clang needs to be
11 // forced to layout the structs used in this test.
12 // The triple in the command line above is used for the assumptions about
13 // size and alignment of types.
15 // Set 1
16 struct T1 {
17 char a;
18 int b;
21 struct __attribute__((packed)) U1 {
22 char a;
23 struct T1 b; // expected-warning {{field b within 'struct U1' is less aligned than 'struct T1' and is usually due to 'struct U1' being packed, which can lead to unaligned accesses}}
24 int c;
27 struct __attribute__((packed)) U2 {
28 char a;
29 struct T1 b __attribute__((aligned(2))); // expected-warning {{field b within 'struct U2' is less aligned than 'struct T1' and is usually due to 'struct U2' being packed, which can lead to unaligned accesses}}
30 int c;
33 struct __attribute__((packed)) U3 {
34 char a;
35 struct T1 b __attribute__((aligned(4)));
36 int c;
39 struct __attribute__((aligned(2))) U4 {
40 char a;
41 struct T1 b;
42 int c;
45 struct U5 {
46 char a;
47 struct T1 b;
48 int c;
51 struct U6 {
52 char a;
53 int b;
54 struct T1 c __attribute__((aligned(2)));
57 struct __attribute__((packed)) U7 {
58 short a;
59 short b;
60 char c;
61 struct T1 d; // expected-warning {{field d within 'struct U7' is less aligned than 'struct T1' and is usually due to 'struct U7' being packed, which can lead to unaligned accesses}}
64 struct U8 {
65 short a;
66 short b;
67 char c;
68 struct T1 d;
71 struct __attribute__((packed)) U9 {
72 short a;
73 short b;
74 char c;
75 struct T1 d __attribute__((aligned(4)));
78 struct __attribute__((packed)) U10 {
79 short a;
80 short b;
81 char c;
82 struct T1 d __attribute__((aligned(2))); // expected-warning {{field d within 'struct U10' is less aligned than 'struct T1' and is usually due to 'struct U10' being packed, which can lead to unaligned accesses}}
85 struct __attribute__((aligned(2))) U11 {
86 short a;
87 short b;
88 char c;
89 struct T1 d;
92 // Set 2
93 #pragma pack(push, 1)
95 struct U12 {
96 char a;
97 struct T1 b; // expected-warning {{field b within 'struct U12' is less aligned than 'struct T1' and is usually due to 'struct U12' being packed, which can lead to unaligned accesses}}
98 int c;
101 struct __attribute__((packed)) U13 {
102 char a;
103 struct T1 b; // expected-warning {{field b within 'struct U13' is less aligned than 'struct T1' and is usually due to 'struct U13' being packed, which can lead to unaligned accesses}}
104 int c;
107 struct __attribute__((packed)) U14 {
108 char a;
109 struct T1 b __attribute__((aligned(4))); // expected-warning {{field b within 'struct U14' is less aligned than 'struct T1' and is usually due to 'struct U14' being packed, which can lead to unaligned accesses}}
110 int c;
113 struct __attribute__((aligned(2))) U15 {
114 char a;
115 struct T1 b; // expected-warning {{field b within 'struct U15' is less aligned than 'struct T1' and is usually due to 'struct U15' being packed, which can lead to unaligned accesses}}
116 int c;
119 struct U16 {
120 char a;
121 char b;
122 short c;
123 struct T1 d;
126 struct U17 {
127 char a;
128 char b;
129 short c;
130 struct T1 d __attribute__((aligned(4)));
133 struct __attribute__((packed)) U18 {
134 char a;
135 short b;
136 struct T1 c __attribute__((aligned(4))); // expected-warning {{field c within 'struct U18' is less aligned than 'struct T1' and is usually due to 'struct U18' being packed, which can lead to unaligned accesses}}
139 struct __attribute__((aligned(4))) U19 {
140 char a;
141 struct T1 b; // expected-warning {{field b within 'struct U19' is less aligned than 'struct T1' and is usually due to 'struct U19' being packed, which can lead to unaligned accesses}}
142 int c;
145 struct __attribute__((aligned(4))) U20 {
146 char a[4];
147 struct T1 b;
148 int c;
151 struct U21 {
152 char a;
153 short c;
154 struct T1 d; // expected-warning {{field d within 'struct U21' is less aligned than 'struct T1' and is usually due to 'struct U21' being packed, which can lead to unaligned accesses}}
157 struct U22 {
158 char a;
159 short c;
160 struct T1 d __attribute__((aligned(4))); // expected-warning {{field d within 'struct U22' is less aligned than 'struct T1' and is usually due to 'struct U22' being packed, which can lead to unaligned accesses}}
163 #pragma pack(pop)
165 // Set 3
166 #pragma pack(push, 2)
168 struct __attribute__((packed)) U23 {
169 char a;
170 struct T1 b; // expected-warning {{field b within 'struct U23' is less aligned than 'struct T1' and is usually due to 'struct U23' being packed, which can lead to unaligned accesses}}
171 int c;
174 struct U24 {
175 char a;
176 struct T1 b; // expected-warning {{field b within 'struct U24' is less aligned than 'struct T1' and is usually due to 'struct U24' being packed, which can lead to unaligned accesses}}
177 int c;
180 struct U25 {
181 char a;
182 char b;
183 short c;
184 struct T1 d;
187 struct U26 {
188 char a;
189 char b;
190 short c;
191 struct T1 d;
194 #pragma pack(pop)
196 // Set 4
198 struct __attribute__((packed)) T2 {
199 char a;
200 struct T1 b; // expected-warning {{field b within 'struct T2' is less aligned than 'struct T1' and is usually due to 'struct T2' being packed, which can lead to unaligned accesses}}
203 struct T3 {
204 char a;
205 struct T1 b;
208 struct __attribute__((packed)) U27 {
209 char a;
210 struct T2 b;
211 int c;
214 struct U28 {
215 char a;
216 char _p[2];
217 struct T2 b;
218 int c;
221 struct U29 {
222 char a;
223 struct T3 b;
224 int c;
227 struct __attribute__((packed)) U30 {
228 char a;
229 struct T3 b; // expected-warning {{field b within 'struct U30' is less aligned than 'struct T3' and is usually due to 'struct U30' being packed, which can lead to unaligned accesses}}
230 int c;
233 struct __attribute__((packed)) U31 {
234 char a;
235 struct T2 b __attribute__((aligned(4)));
238 struct __attribute__((packed)) U32 {
239 char a;
240 char b;
241 char c;
242 char d;
243 struct T3 e;
246 struct __attribute__((packed)) U33 {
247 char a;
248 char b;
249 char c;
250 char d;
251 struct T2 e __attribute__((aligned(4)));
254 struct __attribute__((packed)) U34 {
255 char a;
256 struct T1 b __attribute__((packed)); // expected-warning {{field b within 'struct U34' is less aligned than 'struct T1' and is usually due to 'struct U34' being packed, which can lead to unaligned accesses}}
257 struct T2 c;
260 struct __attribute__((packed)) U35 {
261 char a;
262 struct T4 {
263 char b;
264 struct T1 c;
265 } d; // expected-warning {{field d within 'struct U35' is less aligned than 'struct T4' and is usually due to 'struct U35' being packed, which can lead to unaligned accesses}}
268 // Set 5
270 #pragma pack(push, 1)
271 struct T5 {
272 char a;
273 struct T1 b; // expected-warning {{field b within 'struct T5' is less aligned than 'struct T1' and is usually due to 'struct T5' being packed, which can lead to unaligned accesses}}
275 #pragma pack(pop)
277 #pragma pack(push, 1)
278 struct U36 {
279 char a;
280 struct T5 b;
281 int c;
284 struct U37 {
285 char a;
286 struct T3 b; // expected-warning {{field b within 'struct U37' is less aligned than 'struct T3' and is usually due to 'struct U37' being packed, which can lead to unaligned accesses}}
287 int c;
289 #pragma pack(pop)
290 struct U38 {
291 char a;
292 struct T5 b __attribute__((aligned(4)));
293 int c;
296 #pragma pack(push, 1)
298 #pragma pack(push, 4)
299 struct U39 {
300 char a;
301 struct T5 b;
302 int c;
304 #pragma pack(pop)
306 #pragma pack(pop)
308 // Set 6
310 struct __attribute__((packed)) A1 {
311 char a;
312 struct T1 b; // expected-warning {{field b within 'struct A1' is less aligned than 'struct T1' and is usually due to 'struct A1' being packed, which can lead to unaligned accesses}}
315 struct A2 {
316 char a;
317 struct T1 b;
320 struct __attribute__((packed)) A3 {
321 char a;
322 struct T1 b __attribute__((aligned(4)));
325 #pragma pack(push, 1)
326 struct A4 {
327 char a;
328 struct T1 b; // expected-warning {{field b within 'struct A4' is less aligned than 'struct T1' and is usually due to 'struct A4' being packed, which can lead to unaligned accesses}}
331 struct A5 {
332 char a;
333 struct T1 b __attribute__((aligned(4))); // expected-warning {{field b within 'struct A5' is less aligned than 'struct T1' and is usually due to 'struct A5' being packed, which can lead to unaligned accesses}}
335 #pragma pack(pop)
337 struct __attribute__((packed)) A6 {
338 struct T1 a;
341 struct A7 {
342 char a;
343 struct T1 b __attribute__((packed));
346 struct A8 {
347 char a;
348 char b;
349 short c;
350 struct T1 d;
353 struct A9 {
354 char a;
355 struct T2 b;
358 struct A10 {
359 char a;
360 struct T2 b __attribute__((aligned(4)));
363 struct __attribute__((packed)) A11 {
364 char a;
365 struct T2 b;
368 struct __attribute__((packed)) U40 {
369 char a;
370 struct A1 b;
371 int c;
374 struct __attribute__((packed)) U41 {
375 char a;
376 struct A3 b; // expected-warning {{field b within 'struct U41' is less aligned than 'struct A3' and is usually due to 'struct U41' being packed, which can lead to unaligned accesses}}
377 int c;
380 #pragma pack(push, 1)
381 struct U42 {
382 char a;
383 struct A1 b;
384 int c;
386 #pragma pack(pop)
388 struct __attribute__((packed)) U43 {
389 char a;
390 struct A9 b;
391 int c;
394 struct __attribute__((packed)) U44 {
395 char a;
396 struct A10 b; // expected-warning {{field b within 'struct U44' is less aligned than 'struct A10' and is usually due to 'struct U44' being packed, which can lead to unaligned accesses}}
397 int c;
400 #pragma pack(push, 1)
402 struct U45 {
403 char a;
404 struct A10 b; // expected-warning {{field b within 'struct U45' is less aligned than 'struct A10' and is usually due to 'struct U45' being packed, which can lead to unaligned accesses}}
405 int c;
408 #pragma pack(pop)
410 struct __attribute__((packed)) U46 {
411 char a;
412 struct A2 b; // expected-warning {{field b within 'struct U46' is less aligned than 'struct A2' and is usually due to 'struct U46' being packed, which can lead to unaligned accesses}}
413 int c;
416 struct __attribute__((packed)) U47 {
417 char a;
418 struct A8 b; // expected-warning {{field b within 'struct U47' is less aligned than 'struct A8' and is usually due to 'struct U47' being packed, which can lead to unaligned accesses}}
419 int c;
422 #pragma pack(push, 1)
423 struct U48 {
424 char a;
425 struct A8 b; // expected-warning {{field b within 'struct U48' is less aligned than 'struct A8' and is usually due to 'struct U48' being packed, which can lead to unaligned accesses}}
426 int c;
428 #pragma pack(pop)
430 struct U49 {
431 char a;
432 struct A11 b;
433 int c;
436 struct U50 {
437 char a;
438 struct A1 b;
439 int c;
442 struct U51 {
443 char a;
444 struct A5 b;
445 int c;
448 struct __attribute__((packed)) U52 {
449 char a;
450 struct A6 b;
453 struct U53 {
454 char a;
455 struct A4 b;
458 struct U54 {
459 char b;
460 struct A7 c;
463 struct U1 s1;
464 struct U2 s2;
465 struct U3 s3;
466 struct U4 s4;
467 struct U5 s5;
468 struct U6 s6;
469 struct U7 s7;
470 struct U8 s8;
471 struct U9 s9;
472 struct U10 s10;
473 struct U11 s11;
474 struct U12 s12;
475 struct U13 s13;
476 struct U14 s14;
477 struct U15 s15;
478 struct U16 s16;
479 struct U17 s17;
480 struct U18 s18;
481 struct U19 s19;
482 struct U20 s20;
483 struct U21 s21;
484 struct U22 s22;
485 struct U23 s23;
486 struct U24 s24;
487 struct U25 s25;
488 struct U26 s26;
489 struct U27 s27;
490 struct U28 s28;
491 struct U29 s29;
492 struct U30 s30;
493 struct U31 s31;
494 struct U32 s32;
495 struct U33 s33;
496 struct U34 s34;
497 struct U35 s35;
498 struct U36 s36;
499 struct U37 s37;
500 struct U38 s38;
501 struct U39 s39;
502 struct U40 s40;
503 struct U41 s41;
504 struct U42 s42;
505 struct U43 s43;
506 struct U44 s44;
507 struct U45 s45;
508 struct U46 s46;
509 struct U47 s47;
510 struct U48 s48;
511 struct U49 s49;
512 struct U50 s50;
513 struct U51 s51;
514 struct U52 s52;
515 struct U53 s53;
516 struct U54 s54;