Clang Project

clang_source_code/test/Sema/align-x86.c
1// RUN: %clang_cc1 -std=c11 -triple i386-apple-darwin9 -fsyntax-only -verify %s
2// expected-no-diagnostics
3
4#define STATIC_ASSERT(cond) _Static_assert(cond, #cond)
5
6// PR3433
7#define CHECK_ALIGNMENT(type, name, abi, pref) \
8  type name; \
9  STATIC_ASSERT(__alignof__(name) == pref); \
10  STATIC_ASSERT(__alignof__(type) == pref); \
11  STATIC_ASSERT(_Alignof(type) == abi)
12
13CHECK_ALIGNMENT(double, g_double, 4, 8);
14CHECK_ALIGNMENT(long long, g_longlong, 4, 8);
15CHECK_ALIGNMENT(unsigned long long, g_ulonglong, 4, 8);
16CHECK_ALIGNMENT(_Complex double, g_complexdouble, 4, 8);
17
18// PR6362
19struct __attribute__((packed))
20packed_struct {
21  unsigned int a;
22};
23CHECK_ALIGNMENT(struct packed_struct, g_packedstruct, 1, 1);
24STATIC_ASSERT(__alignof__(g_packedstruct.a) == 1);
25
26typedef double arr3double[3];
27CHECK_ALIGNMENT(arr3double, g_arr3double, 4, 8);
28
29enum big_enum { x = 18446744073709551615ULL };
30CHECK_ALIGNMENT(enum big_enum, g_bigenum, 4, 8);
31
32// PR5637
33
34#define ALIGNED(x) __attribute__((aligned(x)))
35
36typedef ALIGNED(2) struct {
37  char a[3];
38} aligned_before_struct;
39
40STATIC_ASSERT(sizeof(aligned_before_struct)       == 3);
41STATIC_ASSERT(sizeof(aligned_before_struct[1])    == 4);
42STATIC_ASSERT(sizeof(aligned_before_struct[2])    == 6);
43STATIC_ASSERT(sizeof(aligned_before_struct[2][1]) == 8);
44STATIC_ASSERT(sizeof(aligned_before_struct[1][2]) == 6);
45
46typedef struct ALIGNED(2) {
47  char a[3];
48} aligned_after_struct;
49
50STATIC_ASSERT(sizeof(aligned_after_struct)       == 4);
51STATIC_ASSERT(sizeof(aligned_after_struct[1])    == 4);
52STATIC_ASSERT(sizeof(aligned_after_struct[2])    == 8);
53STATIC_ASSERT(sizeof(aligned_after_struct[2][1]) == 8);
54STATIC_ASSERT(sizeof(aligned_after_struct[1][2]) == 8);
55