1 // RUN: %clang_cc1 -fsyntax-only -verify %s
2
3 template<typename T>
4 struct X0 {
5 template<typename U> T f0(U);
6 template<typename U> U& f1(T*, U); // expected-error{{pointer to a reference}} \
7 // expected-note{{candidate}}
8 };
9
10 X0<int> x0i;
11 X0<void> x0v;
12 X0<int&> x0ir; // expected-note{{instantiation}}
13
test_X0(int * ip,double * dp)14 void test_X0(int *ip, double *dp) {
15 X0<int> xi;
16 int i1 = xi.f0(ip);
17 double *&dpr = xi.f1(ip, dp);
18 xi.f1(dp, dp); // expected-error{{no matching}}
19
20 X0<void> xv;
21 double *&dpr2 = xv.f1(ip, dp);
22 }
23
24 template<typename T>
25 struct X1 {
26 template<typename U>
27 struct Inner0 {
28 U x;
29 T y; // expected-error{{void}}
30 };
31
32 template<typename U>
33 struct Inner1 {
34 U x; // expected-error{{void}}
35 T y;
36 };
37
38 template<typename U>
39 struct Inner2 {
40 struct SuperInner {
41 U z; // expected-error{{void}}
42 };
43 };
44
45 template<typename U>
46 struct Inner3 {
f0X1::Inner347 void f0(T t, U u) { // expected-note{{passing argument to parameter 't' here}}
48 (void)(t + u); // expected-error{{invalid operands}}
49 }
50
51 template<typename V>
f1X1::Inner352 V f1(T t, U u, V) {
53 return t + u; // expected-error{{cannot initialize return object}}
54 }
55 };
56
57 template<typename U>
58 struct Inner4;
59 };
60
61 template<typename T>
62 template<typename U>
63 struct X1<T>::Inner4 {
64 template<typename V>
65 V f2(T t, U u, V);
66
67 static U value;
68 };
69
70 template<typename T>
71 template<typename U>
72 U X1<T>::Inner4<U>::value; // expected-error{{reference variable}}
73
74 template<typename T>
75 template<typename U>
76 template<typename V>
f2(T t,U u,V)77 V X1<T>::Inner4<U>::f2(T t, U u, V) {
78 return t + u; // expected-error{{cannot initialize return object}}
79 }
80
test_X1(int * ip,int i,double * dp)81 void test_X1(int *ip, int i, double *dp) {
82 X1<void>::Inner0<int> *xvip; // okay
83 X1<void>::Inner0<int> xvi; // expected-note{{instantiation}}
84
85 X1<int>::Inner1<void> *xivp; // okay
86 X1<int>::Inner1<void> xiv; // expected-note{{instantiation}}
87
88 X1<int>::Inner2<void>::SuperInner *xisivp; // okay
89 X1<int>::Inner2<void>::SuperInner xisiv; // expected-note{{instantiation}}
90
91 X1<int*>::Inner3<int> id3;
92 id3.f0(ip, i);
93 id3.f0(dp, i); // expected-error{{cannot initialize a parameter of type 'int *' with an lvalue of type 'double *'}}
94 id3.f1(ip, i, ip);
95 id3.f1(ip, i, dp); // expected-note{{instantiation}}
96
97 X1<int*>::Inner3<double*> id3b;
98 id3b.f0(ip, dp); // expected-note{{instantiation}}
99
100 X1<int*>::Inner4<int> id4;
101 id4.f2(ip, i, dp); // expected-note{{instantiation}}
102
103 X1<int*>::Inner4<int>::value = 17;
104 i = X1<int*>::Inner4<int&>::value; // expected-note{{instantiation}}
105 }
106
107
108 template<typename T>
109 struct X2 {
110 template<T *Ptr> // expected-error{{pointer to a reference}}
111 struct Inner;
112
113 template<T Value> // expected-error{{cannot have type 'float'}}
114 struct Inner2;
115 };
116
117 X2<int&> x2a; // expected-note{{instantiation}}
118 X2<float> x2b; // expected-note{{instantiation}}
119
120 namespace N0 {
121 template<typename T>
122 struct X0 { };
123
124 struct X1 {
fN0::X1125 template<typename T> void f(X0<T>& vals) { g(vals); }
gN0::X1126 template<typename T> void g(X0<T>& vals) { }
127 };
128
test(X1 x1,X0<int> x0i,X0<long> x0l)129 void test(X1 x1, X0<int> x0i, X0<long> x0l) {
130 x1.f(x0i);
131 x1.f(x0l);
132 }
133 }
134
135 namespace PR6239 {
136 template <typename T>
137 struct X0 {
138 class type {
139 typedef T E;
140 template <E e> // subsitute T for E and bug goes away
141 struct sfinae { };
142
143 template <class U>
144 typename sfinae<&U::operator=>::type test(int);
145 };
146 };
147
148 template <typename T>
149 struct X1 {
150 typedef T E;
151 template <E e> // subsitute T for E and bug goes away
152 struct sfinae { };
153
154 template <class U>
155 typename sfinae<&U::operator=>::type test(int);
156 };
157
158 }
159
160 namespace PR7587 {
161 template<typename> class X0;
162 template<typename> struct X1;
163 template<typename> class X2;
164
165 template<typename T> class X3
166 {
167 template<
168 template<typename> class TT,
169 typename U = typename X1<T>::type
170 >
171 struct Inner {
172 typedef X2<TT<typename X1<T>::type> > Type;
173 };
174
175 const typename Inner<X0>::Type minCoeff() const;
176 };
177
178 template<typename T> class X3<T*>
179 {
180 template<
181 template<typename> class TT,
182 typename U = typename X1<T>::type
183 >
184 struct Inner {
185 typedef X2<TT<typename X1<T>::type> > Type;
186 };
187
188 const typename Inner<X0>::Type minCoeff() const;
189 };
190
191 }
192
193 namespace PR7669 {
194 template<class> struct X {
195 template<class> struct Y {
196 template<int,class> struct Z;
197 template<int Dummy> struct Z<Dummy,int> {};
198 };
199 };
200
a()201 void a()
202 {
203 X<int>::Y<int>::Z<0,int>();
204 }
205 }
206
207 namespace PR8489 {
208 template <typename CT>
209 class C {
210 template<typename FT>
F()211 void F() {} // expected-note{{FT}}
212 };
f()213 void f() {
214 C<int> c;
215 c.F(); // expected-error{{no matching member function}}
216 }
217 }
218
219 namespace rdar8986308 {
220 template <bool> struct __static_assert_test;
221 template <> struct __static_assert_test<true> {};
222 template <unsigned> struct __static_assert_check {};
223
224 namespace std {
225
226 template <class _Tp, class _Up>
227 struct __has_rebind
228 {
229 private:
230 struct __two {char _; char __;};
231 template <class _Xp> static __two __test(...);
232 template <class _Xp> static char __test(typename _Xp::template rebind<_Up>* = 0);
233 public:
234 static const bool value = sizeof(__test<_Tp>(0)) == 1;
235 };
236
237 }
238
239 template <class T> struct B1 {};
240
241 template <class T>
242 struct B
243 {
244 template <class U> struct rebind {typedef B1<U> other;};
245 };
246
247 template <class T, class U> struct D1 {};
248
249 template <class T, class U>
250 struct D
251 {
252 template <class V> struct rebind {typedef D1<V, U> other;};
253 };
254
main()255 int main()
256 {
257 typedef __static_assert_check<sizeof(__static_assert_test<((std::__has_rebind<B<int>, double>::value))>)> __t64;
258 typedef __static_assert_check<sizeof(__static_assert_test<((std::__has_rebind<D<char, int>, double>::value))>)> __t64;
259 }
260
261 }
262