1d410fa259e485b751258e07e750cf45cad01e7eaDaniel Dunbar// RUN: %clang_cc1 -triple armv7-unknown-unknown -target-abi apcs-gnu %s -verify
2d410fa259e485b751258e07e750cf45cad01e7eaDaniel Dunbar// RUN: %clang_cc1 -triple armv7-unknown-unknown -target-abi aapcs %s -verify
38e8fb3be5bd78f0564444eca02b404566a5f3b5dAndy Gibbs// expected-no-diagnostics
4d410fa259e485b751258e07e750cf45cad01e7eaDaniel Dunbar
5684de63867fac4ffe2f4c97756a16bfcb2d8b54bDaniel Dunbar#define check(name, cond) int _##name##_check[(cond) ? 1 : -1]
6d410fa259e485b751258e07e750cf45cad01e7eaDaniel Dunbar
7d410fa259e485b751258e07e750cf45cad01e7eaDaniel Dunbarstruct s0 { char field0; double field1; };
8684de63867fac4ffe2f4c97756a16bfcb2d8b54bDaniel Dunbar#ifdef __ARM_EABI__
9684de63867fac4ffe2f4c97756a16bfcb2d8b54bDaniel Dunbarcheck(s0_size, sizeof(struct s0) == 16);
10684de63867fac4ffe2f4c97756a16bfcb2d8b54bDaniel Dunbar#else
11684de63867fac4ffe2f4c97756a16bfcb2d8b54bDaniel Dunbarcheck(s0_size, sizeof(struct s0) == 12);
12684de63867fac4ffe2f4c97756a16bfcb2d8b54bDaniel Dunbar#endif
13d410fa259e485b751258e07e750cf45cad01e7eaDaniel Dunbar
14d410fa259e485b751258e07e750cf45cad01e7eaDaniel Dunbarstruct s1 { char field0; long double field1; };
15684de63867fac4ffe2f4c97756a16bfcb2d8b54bDaniel Dunbar#ifdef __ARM_EABI__
16684de63867fac4ffe2f4c97756a16bfcb2d8b54bDaniel Dunbarcheck(s1_size, sizeof(struct s1) == 16);
17d410fa259e485b751258e07e750cf45cad01e7eaDaniel Dunbar#else
18684de63867fac4ffe2f4c97756a16bfcb2d8b54bDaniel Dunbarcheck(s1_size, sizeof(struct s1) == 12);
19684de63867fac4ffe2f4c97756a16bfcb2d8b54bDaniel Dunbar#endif
20d410fa259e485b751258e07e750cf45cad01e7eaDaniel Dunbar
21684de63867fac4ffe2f4c97756a16bfcb2d8b54bDaniel Dunbarstruct s2 {
22684de63867fac4ffe2f4c97756a16bfcb2d8b54bDaniel Dunbar  short field0;
23684de63867fac4ffe2f4c97756a16bfcb2d8b54bDaniel Dunbar  int field1 : 24;
24684de63867fac4ffe2f4c97756a16bfcb2d8b54bDaniel Dunbar  char field2;
25684de63867fac4ffe2f4c97756a16bfcb2d8b54bDaniel Dunbar};
26684de63867fac4ffe2f4c97756a16bfcb2d8b54bDaniel Dunbar#ifdef __ARM_EABI__
27684de63867fac4ffe2f4c97756a16bfcb2d8b54bDaniel Dunbarcheck(s2_size, sizeof(struct s2) == 8);
28684de63867fac4ffe2f4c97756a16bfcb2d8b54bDaniel Dunbarcheck(s2_offset_0, __builtin_offsetof(struct s2, field0) == 0);
29684de63867fac4ffe2f4c97756a16bfcb2d8b54bDaniel Dunbarcheck(s2_offset_1, __builtin_offsetof(struct s2, field2) == 7);
30684de63867fac4ffe2f4c97756a16bfcb2d8b54bDaniel Dunbar#else
31684de63867fac4ffe2f4c97756a16bfcb2d8b54bDaniel Dunbarcheck(s2_size, sizeof(struct s2) == 6);
32684de63867fac4ffe2f4c97756a16bfcb2d8b54bDaniel Dunbarcheck(s2_offset_0, __builtin_offsetof(struct s2, field0) == 0);
33684de63867fac4ffe2f4c97756a16bfcb2d8b54bDaniel Dunbarcheck(s2_offset_1, __builtin_offsetof(struct s2, field2) == 5);
34684de63867fac4ffe2f4c97756a16bfcb2d8b54bDaniel Dunbar#endif
35d410fa259e485b751258e07e750cf45cad01e7eaDaniel Dunbar
36684de63867fac4ffe2f4c97756a16bfcb2d8b54bDaniel Dunbarstruct s3 {
37684de63867fac4ffe2f4c97756a16bfcb2d8b54bDaniel Dunbar  short field0;
38684de63867fac4ffe2f4c97756a16bfcb2d8b54bDaniel Dunbar  int field1 : 24 __attribute__((aligned(4)));
39684de63867fac4ffe2f4c97756a16bfcb2d8b54bDaniel Dunbar  char field2;
40684de63867fac4ffe2f4c97756a16bfcb2d8b54bDaniel Dunbar};
41684de63867fac4ffe2f4c97756a16bfcb2d8b54bDaniel Dunbarcheck(s3_size, sizeof(struct s3) == 8);
42684de63867fac4ffe2f4c97756a16bfcb2d8b54bDaniel Dunbarcheck(s3_offset_0, __builtin_offsetof(struct s3, field0) == 0);
43684de63867fac4ffe2f4c97756a16bfcb2d8b54bDaniel Dunbarcheck(s3_offset_1, __builtin_offsetof(struct s3, field2) == 7);
44d410fa259e485b751258e07e750cf45cad01e7eaDaniel Dunbar
45684de63867fac4ffe2f4c97756a16bfcb2d8b54bDaniel Dunbarstruct s4 {
46e224ba7e3e604113aa160c379293bcb6425e8f36Carl Norum  int field0 : 4;
47684de63867fac4ffe2f4c97756a16bfcb2d8b54bDaniel Dunbar};
48684de63867fac4ffe2f4c97756a16bfcb2d8b54bDaniel Dunbar#ifdef __ARM_EABI__
49684de63867fac4ffe2f4c97756a16bfcb2d8b54bDaniel Dunbarcheck(s4_size, sizeof(struct s4) == 4);
50684de63867fac4ffe2f4c97756a16bfcb2d8b54bDaniel Dunbarcheck(s4_align, __alignof(struct s4) == 4);
51684de63867fac4ffe2f4c97756a16bfcb2d8b54bDaniel Dunbar#else
52684de63867fac4ffe2f4c97756a16bfcb2d8b54bDaniel Dunbarcheck(s4_size, sizeof(struct s4) == 1);
53684de63867fac4ffe2f4c97756a16bfcb2d8b54bDaniel Dunbarcheck(s4_align, __alignof(struct s4) == 1);
54d410fa259e485b751258e07e750cf45cad01e7eaDaniel Dunbar#endif
55