1// RUN: %clang_cc1 -triple armv7-unknown-unknown -target-abi apcs-gnu %s -verify
2// RUN: %clang_cc1 -triple armv7-unknown-unknown -target-abi aapcs %s -verify
3// expected-no-diagnostics
4
5#define check(name, cond) int _##name##_check[(cond) ? 1 : -1]
6
7struct s0 { char field0; double field1; };
8#ifdef __ARM_EABI__
9check(s0_size, sizeof(struct s0) == 16);
10#else
11check(s0_size, sizeof(struct s0) == 12);
12#endif
13
14struct s1 { char field0; long double field1; };
15#ifdef __ARM_EABI__
16check(s1_size, sizeof(struct s1) == 16);
17#else
18check(s1_size, sizeof(struct s1) == 12);
19#endif
20
21struct s2 {
22  short field0;
23  int field1 : 24;
24  char field2;
25};
26#ifdef __ARM_EABI__
27check(s2_size, sizeof(struct s2) == 8);
28check(s2_offset_0, __builtin_offsetof(struct s2, field0) == 0);
29check(s2_offset_1, __builtin_offsetof(struct s2, field2) == 7);
30#else
31check(s2_size, sizeof(struct s2) == 6);
32check(s2_offset_0, __builtin_offsetof(struct s2, field0) == 0);
33check(s2_offset_1, __builtin_offsetof(struct s2, field2) == 5);
34#endif
35
36struct s3 {
37  short field0;
38  int field1 : 24 __attribute__((aligned(4)));
39  char field2;
40};
41check(s3_size, sizeof(struct s3) == 8);
42check(s3_offset_0, __builtin_offsetof(struct s3, field0) == 0);
43check(s3_offset_1, __builtin_offsetof(struct s3, field2) == 7);
44
45struct s4 {
46  int field0 : 4;
47};
48#ifdef __ARM_EABI__
49check(s4_size, sizeof(struct s4) == 4);
50check(s4_align, __alignof(struct s4) == 4);
51#else
52check(s4_size, sizeof(struct s4) == 1);
53check(s4_align, __alignof(struct s4) == 1);
54#endif
55