1*67e74705SXin Li // RUN: %clang_cc1 -std=gnu++11 -fsyntax-only -verify %s 2*67e74705SXin Li 3*67e74705SXin Li namespace attribute_aligned { 4*67e74705SXin Li template<int N> 5*67e74705SXin Li struct X { 6*67e74705SXin Li char c[1] __attribute__((__aligned__((N)))); // expected-error {{alignment is not a power of 2}} 7*67e74705SXin Li }; 8*67e74705SXin Li 9*67e74705SXin Li template <bool X> struct check { 10*67e74705SXin Li int check_failed[X ? 1 : -1]; // expected-error {{array with a negative size}} 11*67e74705SXin Li }; 12*67e74705SXin Li 13*67e74705SXin Li template <int N> struct check_alignment { 14*67e74705SXin Li typedef check<N == sizeof(X<N>)> t; // expected-note {{in instantiation}} 15*67e74705SXin Li }; 16*67e74705SXin Li 17*67e74705SXin Li check_alignment<1>::t c1; 18*67e74705SXin Li check_alignment<2>::t c2; 19*67e74705SXin Li check_alignment<3>::t c3; // expected-note 2 {{in instantiation}} 20*67e74705SXin Li check_alignment<4>::t c4; 21*67e74705SXin Li 22*67e74705SXin Li template<unsigned Size, unsigned Align> 23*67e74705SXin Li class my_aligned_storage 24*67e74705SXin Li { 25*67e74705SXin Li __attribute__((aligned(Align))) char storage[Size]; 26*67e74705SXin Li }; 27*67e74705SXin Li 28*67e74705SXin Li template<typename T> 29*67e74705SXin Li class C { 30*67e74705SXin Li public: C()31*67e74705SXin Li C() { 32*67e74705SXin Li static_assert(sizeof(t) == sizeof(T), "my_aligned_storage size wrong"); 33*67e74705SXin Li static_assert(alignof(t) == alignof(T), "my_aligned_storage align wrong"); // expected-warning{{'alignof' applied to an expression is a GNU extension}} 34*67e74705SXin Li } 35*67e74705SXin Li 36*67e74705SXin Li private: 37*67e74705SXin Li my_aligned_storage<sizeof(T), alignof(T)> t; 38*67e74705SXin Li }; 39*67e74705SXin Li 40*67e74705SXin Li C<double> cd; 41*67e74705SXin Li } 42*67e74705SXin Li 43*67e74705SXin Li namespace PR9049 { 44*67e74705SXin Li extern const void *CFRetain(const void *ref); 45*67e74705SXin Li 46*67e74705SXin Li template<typename T> __attribute__((cf_returns_retained)) WBCFRetain(T aValue)47*67e74705SXin Li inline T WBCFRetain(T aValue) { return aValue ? (T)CFRetain(aValue) : (T)0; } 48*67e74705SXin Li 49*67e74705SXin Li 50*67e74705SXin Li extern void CFRelease(const void *ref); 51*67e74705SXin Li 52*67e74705SXin Li template<typename T> WBCFRelease(T aValue)53*67e74705SXin Li inline void WBCFRelease(__attribute__((cf_consumed)) T aValue) { if(aValue) CFRelease(aValue); } 54*67e74705SXin Li } 55