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