blob: 519cbe66f18194ea748520bdfe65f8885b5db966 [file] [log] [blame]
Richard Smith6822bd72018-10-26 19:26:45 +00001// RUN: %clang_cc1 -std=c11 -triple i386-apple-darwin9 -fsyntax-only -verify %s
Andy Gibbsc6e68da2012-10-19 12:44:48 +00002// expected-no-diagnostics
Eli Friedman3f8c01a2009-02-22 03:31:23 +00003
Richard Smith6822bd72018-10-26 19:26:45 +00004#define STATIC_ASSERT(cond) _Static_assert(cond, #cond)
5
Eli Friedman3f8c01a2009-02-22 03:31:23 +00006// PR3433
Richard Smith6822bd72018-10-26 19:26:45 +00007#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)
Eli Friedman7ab09572009-05-25 21:27:19 +000012
Richard Smith6822bd72018-10-26 19:26:45 +000013CHECK_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);
Charles Davis3fc51072010-02-23 04:52:00 +000017
18// PR6362
Richard Smith6822bd72018-10-26 19:26:45 +000019struct __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);
Charles Davis3fc51072010-02-23 04:52:00 +000025
Richard Smith6822bd72018-10-26 19:26:45 +000026typedef double arr3double[3];
27CHECK_ALIGNMENT(arr3double, g_arr3double, 4, 8);
Richard Smithd7e1fe42014-06-10 23:43:44 +000028
Richard Smith6822bd72018-10-26 19:26:45 +000029enum big_enum { x = 18446744073709551615ULL };
30CHECK_ALIGNMENT(enum big_enum, g_bigenum, 4, 8);
Argyrios Kyrtzidisae40e4e2011-04-26 21:05:39 +000031
32// PR5637
33
34#define ALIGNED(x) __attribute__((aligned(x)))
35
36typedef ALIGNED(2) struct {
37 char a[3];
Richard Smith6822bd72018-10-26 19:26:45 +000038} aligned_before_struct;
Argyrios Kyrtzidisae40e4e2011-04-26 21:05:39 +000039
Richard Smith6822bd72018-10-26 19:26:45 +000040STATIC_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);
Argyrios Kyrtzidisae40e4e2011-04-26 21:05:39 +000045
46typedef struct ALIGNED(2) {
47 char a[3];
Richard Smith6822bd72018-10-26 19:26:45 +000048} aligned_after_struct;
Argyrios Kyrtzidisae40e4e2011-04-26 21:05:39 +000049
Richard Smith6822bd72018-10-26 19:26:45 +000050STATIC_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);