| // RUN: %clang_cc1 %s -triple=armv7-none-none-eabi -verify -Wunaligned-access -S -emit-llvm -o %t |
| // REQUIRES: arm-registered-target |
| // |
| // This test suite tests the warning triggered by the -Wunaligned-access option. |
| // The warning occurs when a struct or other type of record contains a field |
| // that is itself a record. The outer record must be a packed structure, while |
| // while the inner record must be unpacked. This is the fundamental condition |
| // for the warning to be triggered. Some of these tests may have three layers. |
| // |
| // The command line option -fsyntax-only is not used as Clang needs to be |
| // forced to layout the structs used in this test. |
| // The triple in the command line above is used for the assumptions about |
| // size and alignment of types. |
| |
| // Set 1 |
| struct T1 { |
| char a; |
| int b; |
| }; |
| |
| struct __attribute__((packed)) U1 { |
| char a; |
| 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}} |
| int c; |
| }; |
| |
| struct __attribute__((packed)) U2 { |
| char a; |
| 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}} |
| int c; |
| }; |
| |
| struct __attribute__((packed)) U3 { |
| char a; |
| struct T1 b __attribute__((aligned(4))); |
| int c; |
| }; |
| |
| struct __attribute__((aligned(2))) U4 { |
| char a; |
| struct T1 b; |
| int c; |
| }; |
| |
| struct U5 { |
| char a; |
| struct T1 b; |
| int c; |
| }; |
| |
| struct U6 { |
| char a; |
| int b; |
| struct T1 c __attribute__((aligned(2))); |
| }; |
| |
| struct __attribute__((packed)) U7 { |
| short a; |
| short b; |
| char c; |
| 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}} |
| }; |
| |
| struct U8 { |
| short a; |
| short b; |
| char c; |
| struct T1 d; |
| }; |
| |
| struct __attribute__((packed)) U9 { |
| short a; |
| short b; |
| char c; |
| struct T1 d __attribute__((aligned(4))); |
| }; |
| |
| struct __attribute__((packed)) U10 { |
| short a; |
| short b; |
| char c; |
| 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}} |
| }; |
| |
| struct __attribute__((aligned(2))) U11 { |
| short a; |
| short b; |
| char c; |
| struct T1 d; |
| }; |
| |
| // Set 2 |
| #pragma pack(push, 1) |
| |
| struct U12 { |
| char a; |
| 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}} |
| int c; |
| }; |
| |
| struct __attribute__((packed)) U13 { |
| char a; |
| 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}} |
| int c; |
| }; |
| |
| struct __attribute__((packed)) U14 { |
| char a; |
| 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}} |
| int c; |
| }; |
| |
| struct __attribute__((aligned(2))) U15 { |
| char a; |
| 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}} |
| int c; |
| }; |
| |
| struct U16 { |
| char a; |
| char b; |
| short c; |
| struct T1 d; |
| }; |
| |
| struct U17 { |
| char a; |
| char b; |
| short c; |
| struct T1 d __attribute__((aligned(4))); |
| }; |
| |
| struct __attribute__((packed)) U18 { |
| char a; |
| short b; |
| 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}} |
| }; |
| |
| struct __attribute__((aligned(4))) U19 { |
| char a; |
| 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}} |
| int c; |
| }; |
| |
| struct __attribute__((aligned(4))) U20 { |
| char a[4]; |
| struct T1 b; |
| int c; |
| }; |
| |
| struct U21 { |
| char a; |
| short c; |
| 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}} |
| }; |
| |
| struct U22 { |
| char a; |
| short c; |
| 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}} |
| }; |
| |
| #pragma pack(pop) |
| |
| // Set 3 |
| #pragma pack(push, 2) |
| |
| struct __attribute__((packed)) U23 { |
| char a; |
| 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}} |
| int c; |
| }; |
| |
| struct U24 { |
| char a; |
| 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}} |
| int c; |
| }; |
| |
| struct U25 { |
| char a; |
| char b; |
| short c; |
| struct T1 d; |
| }; |
| |
| struct U26 { |
| char a; |
| char b; |
| short c; |
| struct T1 d; |
| }; |
| |
| #pragma pack(pop) |
| |
| // Set 4 |
| |
| struct __attribute__((packed)) T2 { |
| char a; |
| 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}} |
| }; |
| |
| struct T3 { |
| char a; |
| struct T1 b; |
| }; |
| |
| struct __attribute__((packed)) U27 { |
| char a; |
| struct T2 b; |
| int c; |
| }; |
| |
| struct U28 { |
| char a; |
| char _p[2]; |
| struct T2 b; |
| int c; |
| }; |
| |
| struct U29 { |
| char a; |
| struct T3 b; |
| int c; |
| }; |
| |
| struct __attribute__((packed)) U30 { |
| char a; |
| 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}} |
| int c; |
| }; |
| |
| struct __attribute__((packed)) U31 { |
| char a; |
| struct T2 b __attribute__((aligned(4))); |
| }; |
| |
| struct __attribute__((packed)) U32 { |
| char a; |
| char b; |
| char c; |
| char d; |
| struct T3 e; |
| }; |
| |
| struct __attribute__((packed)) U33 { |
| char a; |
| char b; |
| char c; |
| char d; |
| struct T2 e __attribute__((aligned(4))); |
| }; |
| |
| struct __attribute__((packed)) U34 { |
| char a; |
| 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}} |
| struct T2 c; |
| }; |
| |
| struct __attribute__((packed)) U35 { |
| char a; |
| struct T4 { |
| char b; |
| struct T1 c; |
| } 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}} |
| }; |
| |
| // Set 5 |
| |
| #pragma pack(push, 1) |
| struct T5 { |
| char a; |
| 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}} |
| }; |
| #pragma pack(pop) |
| |
| #pragma pack(push, 1) |
| struct U36 { |
| char a; |
| struct T5 b; |
| int c; |
| }; |
| |
| struct U37 { |
| char a; |
| 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}} |
| int c; |
| }; |
| #pragma pack(pop) |
| struct U38 { |
| char a; |
| struct T5 b __attribute__((aligned(4))); |
| int c; |
| }; |
| |
| #pragma pack(push, 1) |
| |
| #pragma pack(push, 4) |
| struct U39 { |
| char a; |
| struct T5 b; |
| int c; |
| }; |
| #pragma pack(pop) |
| |
| #pragma pack(pop) |
| |
| // Set 6 |
| |
| struct __attribute__((packed)) A1 { |
| char a; |
| 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}} |
| }; |
| |
| struct A2 { |
| char a; |
| struct T1 b; |
| }; |
| |
| struct __attribute__((packed)) A3 { |
| char a; |
| struct T1 b __attribute__((aligned(4))); |
| }; |
| |
| #pragma pack(push, 1) |
| struct A4 { |
| char a; |
| 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}} |
| }; |
| |
| struct A5 { |
| char a; |
| 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}} |
| }; |
| #pragma pack(pop) |
| |
| struct __attribute__((packed)) A6 { |
| struct T1 a; |
| }; |
| |
| struct A7 { |
| char a; |
| struct T1 b __attribute__((packed)); |
| }; |
| |
| struct A8 { |
| char a; |
| char b; |
| short c; |
| struct T1 d; |
| }; |
| |
| struct A9 { |
| char a; |
| struct T2 b; |
| }; |
| |
| struct A10 { |
| char a; |
| struct T2 b __attribute__((aligned(4))); |
| }; |
| |
| struct __attribute__((packed)) A11 { |
| char a; |
| struct T2 b; |
| }; |
| |
| struct __attribute__((packed)) U40 { |
| char a; |
| struct A1 b; |
| int c; |
| }; |
| |
| struct __attribute__((packed)) U41 { |
| char a; |
| 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}} |
| int c; |
| }; |
| |
| #pragma pack(push, 1) |
| struct U42 { |
| char a; |
| struct A1 b; |
| int c; |
| }; |
| #pragma pack(pop) |
| |
| struct __attribute__((packed)) U43 { |
| char a; |
| struct A9 b; |
| int c; |
| }; |
| |
| struct __attribute__((packed)) U44 { |
| char a; |
| 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}} |
| int c; |
| }; |
| |
| #pragma pack(push, 1) |
| |
| struct U45 { |
| char a; |
| 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}} |
| int c; |
| }; |
| |
| #pragma pack(pop) |
| |
| struct __attribute__((packed)) U46 { |
| char a; |
| 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}} |
| int c; |
| }; |
| |
| struct __attribute__((packed)) U47 { |
| char a; |
| 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}} |
| int c; |
| }; |
| |
| #pragma pack(push, 1) |
| struct U48 { |
| char a; |
| 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}} |
| int c; |
| }; |
| #pragma pack(pop) |
| |
| struct U49 { |
| char a; |
| struct A11 b; |
| int c; |
| }; |
| |
| struct U50 { |
| char a; |
| struct A1 b; |
| int c; |
| }; |
| |
| struct U51 { |
| char a; |
| struct A5 b; |
| int c; |
| }; |
| |
| struct __attribute__((packed)) U52 { |
| char a; |
| struct A6 b; |
| }; |
| |
| struct U53 { |
| char a; |
| struct A4 b; |
| }; |
| |
| struct U54 { |
| char b; |
| struct A7 c; |
| }; |
| |
| struct U1 s1; |
| struct U2 s2; |
| struct U3 s3; |
| struct U4 s4; |
| struct U5 s5; |
| struct U6 s6; |
| struct U7 s7; |
| struct U8 s8; |
| struct U9 s9; |
| struct U10 s10; |
| struct U11 s11; |
| struct U12 s12; |
| struct U13 s13; |
| struct U14 s14; |
| struct U15 s15; |
| struct U16 s16; |
| struct U17 s17; |
| struct U18 s18; |
| struct U19 s19; |
| struct U20 s20; |
| struct U21 s21; |
| struct U22 s22; |
| struct U23 s23; |
| struct U24 s24; |
| struct U25 s25; |
| struct U26 s26; |
| struct U27 s27; |
| struct U28 s28; |
| struct U29 s29; |
| struct U30 s30; |
| struct U31 s31; |
| struct U32 s32; |
| struct U33 s33; |
| struct U34 s34; |
| struct U35 s35; |
| struct U36 s36; |
| struct U37 s37; |
| struct U38 s38; |
| struct U39 s39; |
| struct U40 s40; |
| struct U41 s41; |
| struct U42 s42; |
| struct U43 s43; |
| struct U44 s44; |
| struct U45 s45; |
| struct U46 s46; |
| struct U47 s47; |
| struct U48 s48; |
| struct U49 s49; |
| struct U50 s50; |
| struct U51 s51; |
| struct U52 s52; |
| struct U53 s53; |
| struct U54 s54; |