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 
test_make1()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 
test_make2()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 
test_make3()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 
test_make4()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 
test_make6()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