1// RUN: %clang_cc1 -fsyntax-only -verify %s 2template<typename T, unsigned Length> 3struct make1 { 4 typedef T __attribute__((ext_vector_type(Length))) type; 5}; 6 7void test_make1() { 8 make1<int, 5>::type x; 9 x.x = 4; 10} 11 12template<typename T, unsigned Length> 13struct make2 { 14 typedef T __attribute__((ext_vector_type(Length))) type; // expected-error{{zero vector size}} 15}; 16 17int test_make2() { 18 make2<int, 0> x; // expected-note{{in instantiation of}} 19} 20 21template<typename T, unsigned Length> 22struct make3 { 23 typedef T __attribute__((ext_vector_type(Length))) type; // expected-error{{invalid vector element type 's'}} 24}; 25 26struct s {}; 27 28int test_make3() { 29 make3<s, 3>x; // expected-note{{in instantiation of}} 30} 31 32template<typename T, T Length> 33struct make4 { 34 typedef T __attribute__((ext_vector_type(Length))) type; 35}; 36 37int test_make4() { 38 make4<int, 4>::type x; 39 x.w = 7; 40} 41 42typedef int* int_ptr; 43template<unsigned Length> 44struct make5 { 45 typedef int_ptr __attribute__((ext_vector_type(Length))) type; // expected-error{{invalid vector element type}} 46}; 47 48template<int Length> 49struct make6 { 50 typedef int __attribute__((ext_vector_type(Length))) type; 51}; 52 53int 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 62namespace 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