// 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. // Packed-Unpacked Tests (No Pragma) struct T1 { char a; int b; }; struct __attribute__((packed)) U1 { char a; T1 b; // expected-warning {{field b within 'U1' is less aligned than 'T1' and is usually due to 'U1' being packed, which can lead to unaligned accesses}} int c; }; struct __attribute__((packed)) U2 { char a; T1 b __attribute__((aligned(4))); int c; }; struct __attribute__((packed)) U3 { char a; char b; short c; T1 d; }; struct __attribute__((packed)) U4 { T1 a; int b; }; struct __attribute__((aligned(4), packed)) U5 { char a; T1 b; // expected-warning {{field b within 'U5' is less aligned than 'T1' and is usually due to 'U5' being packed, which can lead to unaligned accesses}} int c; }; struct __attribute__((aligned(4), packed)) U6 { char a; char b; short c; T1 d; }; // Packed-Unpacked Tests with Pragma #pragma pack(push, 1) struct __attribute__((packed)) U7 { char a; T1 b; // expected-warning {{field b within 'U7' is less aligned than 'T1' and is usually due to 'U7' being packed, which can lead to unaligned accesses}} int c; }; struct __attribute__((packed)) U8 { char a; T1 b __attribute__((aligned(4))); // expected-warning {{field b within 'U8' is less aligned than 'T1' and is usually due to 'U8' being packed, which can lead to unaligned accesses}} int c; }; struct __attribute__((aligned(4))) U9 { char a; T1 b; // expected-warning {{field b within 'U9' is less aligned than 'T1' and is usually due to 'U9' being packed, which can lead to unaligned accesses}} int c; }; struct U10 { char a; T1 b; // expected-warning {{field b within 'U10' is less aligned than 'T1' and is usually due to 'U10' being packed, which can lead to unaligned accesses}} int c; }; #pragma pack(pop) // Packed-Packed Tests struct __attribute__((packed)) T2 { char a; int b; }; struct __attribute__((packed)) U11 { char a; T2 b; int c; }; #pragma pack(push, 1) struct U12 { char a; T2 b; int c; }; #pragma pack(pop) // Unpacked-Packed Tests struct U13 { char a; T2 b; int c; }; struct U14 { char a; T2 b __attribute__((aligned(4))); int c; }; // Unpacked-Unpacked Test struct T3 { char a; int b; }; struct U15 { char a; T3 b; int c; }; // Packed-Packed-Unpacked Test (No pragma) struct __attribute__((packed)) A1 { char a; T1 b; // expected-warning {{field b within 'A1' is less aligned than 'T1' and is usually due to 'A1' being packed, which can lead to unaligned accesses}} }; struct __attribute__((packed)) U16 { char a; A1 b; int c; }; struct __attribute__((packed)) A2 { char a; T1 b __attribute__((aligned(4))); }; struct __attribute__((packed)) U17 { char a; A2 b; // expected-warning {{field b within 'U17' is less aligned than 'A2' and is usually due to 'U17' being packed, which can lead to unaligned accesses}} int c; }; // Packed-Unpacked-Packed tests struct A3 { char a; T2 b; }; struct __attribute__((packed)) U18 { char a; A3 b; int c; }; struct A4 { char a; T2 b; int c; }; #pragma pack(push, 1) struct U19 { char a; A4 b; // expected-warning {{field b within 'U19' is less aligned than 'A4' and is usually due to 'U19' being packed, which can lead to unaligned accesses}} int c; }; #pragma pack(pop) // Packed-Unpacked-Unpacked tests struct A5 { char a; T1 b; }; struct __attribute__((packed)) U20 { char a; A5 b; // expected-warning {{field b within 'U20' is less aligned than 'A5' and is usually due to 'U20' being packed, which can lead to unaligned accesses}} int c; }; struct A6 { char a; T1 b; }; #pragma pack(push, 1) struct U21 { char a; A6 b; // expected-warning {{field b within 'U21' is less aligned than 'A6' and is usually due to 'U21' being packed, which can lead to unaligned accesses}} int c; }; #pragma pack(pop) // Unpacked-Packed-Packed test struct __attribute__((packed)) A7 { char a; T2 b; }; struct U22 { char a; A7 b; int c; }; // Unpacked-Packed-Unpacked tests struct __attribute__((packed)) A8 { char a; T1 b; // expected-warning {{field b within 'A8' is less aligned than 'T1' and is usually due to 'A8' being packed, which can lead to unaligned accesses}} }; struct U23 { char a; A8 b; int c; }; struct __attribute__((packed)) A9 { char a; T1 b __attribute__((aligned(4))); }; struct U24 { char a; A9 b; int 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;