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