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 | |
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 { |
47 | 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> |
52 | 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> |
77 | V X1<T>::Inner4<U>::f2(T t, U u, V) { |
78 | return t + u; // expected-error{{cannot initialize return object}} |
79 | } |
80 | |
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 { |
125 | template<typename T> void f(X0<T>& vals) { g(vals); } |
126 | template<typename T> void g(X0<T>& vals) { } |
127 | }; |
128 | |
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 | |
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> |
211 | void F() {} // expected-note{{FT}} |
212 | }; |
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 | |
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 | |