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