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