xref: /aosp_15_r20/external/clang/test/SemaTemplate/attributes.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
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