Home | History | Annotate | Download | only in SemaTemplate
      1 // RUN: %clang_cc1 -fsyntax-only -verify %s
      2 template<typename T, unsigned Length>
      3 struct make1 {
      4   typedef T __attribute__((ext_vector_type(Length))) type;
      5 };
      6 
      7 void test_make1() {
      8   make1<int, 5>::type x;
      9   x.x = 4;
     10 }
     11 
     12 template<typename T, unsigned Length>
     13 struct make2 {
     14   typedef T __attribute__((ext_vector_type(Length))) type; // expected-error{{zero vector size}}
     15 };
     16 
     17 int test_make2() {
     18   make2<int, 0> x; // expected-note{{in instantiation of}}
     19 }
     20 
     21 template<typename T, unsigned Length>
     22 struct make3 {
     23   typedef T __attribute__((ext_vector_type(Length))) type; // expected-error{{invalid vector element type 's'}}
     24 };
     25 
     26 struct s {};
     27 
     28 int test_make3() {
     29   make3<s, 3>x; // expected-note{{in instantiation of}}
     30 }
     31 
     32 template<typename T, T Length>
     33 struct make4 {
     34   typedef T __attribute__((ext_vector_type(Length))) type;
     35 };
     36 
     37 int test_make4() {
     38   make4<int, 4>::type x;
     39   x.w = 7;
     40 }
     41 
     42 typedef int* int_ptr;
     43 template<unsigned Length>
     44 struct make5 {
     45   typedef int_ptr __attribute__((ext_vector_type(Length))) type; // expected-error{{invalid vector element type}}
     46 };
     47 
     48 template<int Length>
     49 struct make6 {
     50   typedef int __attribute__((ext_vector_type(Length))) type;
     51 };
     52 
     53 int test_make6() {
     54   make6<4>::type x;
     55   x.w = 7;
     56 
     57   make6<2>::type y;
     58   y.x = -1;
     59   y.w = -1; // expected-error{{vector component access exceeds type}}
     60 }
     61 
     62 namespace Deduction {
     63   template<typename T> struct X0;
     64 
     65   template<typename T, unsigned N>
     66   struct X0<T __attribute__((ext_vector_type(N)))> {
     67     static const unsigned value = 0;
     68   };
     69 
     70   template<typename T>
     71   struct X0<T __attribute__((ext_vector_type(4)))> {
     72     static const unsigned value = 1;
     73   };
     74 
     75   template<unsigned N>
     76   struct X0<float __attribute__((ext_vector_type(N)))> {
     77     static const unsigned value = 2;
     78   };
     79 
     80   template<>
     81   struct X0<float __attribute__((ext_vector_type(4)))> {
     82     static const unsigned value = 3;
     83   };
     84 
     85   typedef int __attribute__((ext_vector_type(2))) int2;
     86   typedef int __attribute__((ext_vector_type(4))) int4;
     87   typedef float __attribute__((ext_vector_type(2))) float2;
     88   typedef float __attribute__((ext_vector_type(4))) float4;
     89 
     90   int array0[X0<int2>::value == 0? 1 : -1];
     91   int array1[X0<int4>::value == 1? 1 : -1];
     92   int array2[X0<float2>::value == 2? 1 : -1];
     93   int array3[X0<float4>::value == 3? 1 : -1];
     94 }
     95