62 lines · cpp
1// RUN: %clang_cc1 -std=c++11 -triple i386-apple-darwin9 -fsyntax-only -verify %s2 3using size_t = decltype(sizeof(0));4 5struct complex_double {6 double real;7 double imag;8};9 10template <typename T, size_t ABI, size_t Preferred>11struct check_alignment {12 using type = T;13 static type value;14 15 static_assert(__alignof__(value) == Preferred, "__alignof__(value) != Preferred");16 static_assert(__alignof__(type) == Preferred, "__alignof__(type) != Preferred");17 static_assert(alignof(type) == ABI, "alignof(type) != ABI");18};19 20// PR343321template struct check_alignment<double, 4, 8>;22template struct check_alignment<long long, 4, 8>;23template struct check_alignment<unsigned long long, 4, 8>;24template struct check_alignment<complex_double, 4, 4>;25 26// PR636227struct __attribute__((packed))28packed_struct {29 unsigned int a;30} g_packedstruct;31template struct check_alignment<packed_struct, 1, 1>;32static_assert(__alignof__(g_packedstruct.a) == 1, "__alignof__(packed_struct.member) != 1");33 34template struct check_alignment<double[3], 4, 8>;35 36enum big_enum { x = 18446744073709551615ULL };37template struct check_alignment<big_enum, 4, 8>;38 39// PR563740 41#define ALIGNED(x) __attribute__((aligned(x)))42 43typedef ALIGNED(2) struct {44 char a[3];45} aligned_before_struct;46 47static_assert(sizeof(aligned_before_struct) == 3, "");48static_assert(sizeof(aligned_before_struct[1]) == 4, ""); // expected-error {{size of array element}}49static_assert(sizeof(aligned_before_struct[2]) == 6, ""); // expected-error {{size of array element}}50static_assert(sizeof(aligned_before_struct[2][1]) == 8, ""); // expected-error {{size of array element}}51static_assert(sizeof(aligned_before_struct[1][2]) == 6, ""); // expected-error {{size of array element}}52 53typedef struct ALIGNED(2) {54 char a[3];55} aligned_after_struct;56 57static_assert(sizeof(aligned_after_struct) == 4, "");58static_assert(sizeof(aligned_after_struct[1]) == 4, "");59static_assert(sizeof(aligned_after_struct[2]) == 8, "");60static_assert(sizeof(aligned_after_struct[2][1]) == 8, "");61static_assert(sizeof(aligned_after_struct[1][2]) == 8, "");62