1 // RUN: %clang_cc1 -fsyntax-only -verify %s
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}}
12 X0
<int&> x0ir
; // expected-note{{instantiation}}
14 void test_X0(int *ip
, double *dp
) {
17 double *&dpr
= xi
.f1(ip
, dp
);
18 xi
.f1(dp
, dp
); // expected-error{{no matching}}
21 double *&dpr2
= xv
.f1(ip
, dp
);
29 T y
; // expected-error{{void}}
34 U x
; // expected-error{{void}}
41 U z
; // expected-error{{void}}
47 void f0(T t
, U u
) { // expected-note{{passing argument to parameter 't' here}}
48 (void)(t
+ u
); // expected-error{{invalid operands}}
53 return t
+ u
; // expected-error{{cannot initialize return object}}
63 struct X1
<T
>::Inner4
{
72 U X1
<T
>::Inner4
<U
>::value
; // expected-error{{reference variable}}
77 V X1
<T
>::Inner4
<U
>::f2(T t
, U u
, V
) {
78 return t
+ u
; // expected-error{{cannot initialize return object}}
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}}
85 X1
<int>::Inner1
<void> *xivp
; // okay
86 X1
<int>::Inner1
<void> xiv
; // expected-note{{instantiation}}
88 X1
<int>::Inner2
<void>::SuperInner
*xisivp
; // okay
89 X1
<int>::Inner2
<void>::SuperInner xisiv
; // expected-note{{instantiation}}
91 X1
<int*>::Inner3
<int> id3
;
93 id3
.f0(dp
, i
); // expected-error{{cannot initialize a parameter of type 'int *' with an lvalue of type 'double *'}}
95 id3
.f1(ip
, i
, dp
); // expected-note{{instantiation}}
97 X1
<int*>::Inner3
<double*> id3b
;
98 id3b
.f0(ip
, dp
); // expected-note{{instantiation}}
100 X1
<int*>::Inner4
<int> id4
;
101 id4
.f2(ip
, i
, dp
); // expected-note{{instantiation}}
103 X1
<int*>::Inner4
<int>::value
= 17;
104 i
= X1
<int*>::Inner4
<int&>::value
; // expected-note{{instantiation}}
110 template<T
*Ptr
> // expected-error{{pointer to a reference}}
113 template<T Value
> // expected-error{{cannot have type 'float'}}
117 X2
<int&> x2a
; // expected-note{{instantiation}}
118 X2
<float> x2b
; // expected-note{{instantiation}}
125 template<typename T
> void f(X0
<T
>& vals
) { g(vals
); }
126 template<typename T
> void g(X0
<T
>& vals
) { }
129 void test(X1 x1
, X0
<int> x0i
, X0
<long> x0l
) {
136 template <typename T
>
140 template <E e
> // subsitute T for E and bug goes away
144 typename sfinae
<&U::operator=>::type
test(int);
148 template <typename T
>
151 template <E e
> // subsitute T for E and bug goes away
155 typename sfinae
<&U::operator=>::type
test(int);
161 template<typename
> class X0
;
162 template<typename
> struct X1
;
163 template<typename
> class X2
;
165 template<typename T
> class X3
168 template<typename
> class TT
,
169 typename U
= typename X1
<T
>::type
172 typedef X2
<TT
<typename X1
<T
>::type
> > Type
;
175 const typename Inner
<X0
>::Type
minCoeff() const;
178 template<typename T
> class X3
<T
*>
181 template<typename
> class TT
,
182 typename U
= typename X1
<T
>::type
185 typedef X2
<TT
<typename X1
<T
>::type
> > Type
;
188 const typename Inner
<X0
>::Type
minCoeff() const;
194 template<class> struct X
{
195 template<class> struct Y
{
196 template<int,class> struct Z
;
197 template<int Dummy
> struct Z
<Dummy
,int> {};
203 X
<int>::Y
<int>::Z
<0,int>();
208 template <typename CT
>
210 template<typename FT
>
211 void F() {} // expected-note{{FT}}
215 c
.F(); // expected-error{{no matching member function}}
219 namespace rdar8986308
{
220 template <bool> struct __static_assert_test
;
221 template <> struct __static_assert_test
<true> {};
222 template <unsigned> struct __static_assert_check
{};
226 template <class _Tp
, class _Up
>
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);
234 static const bool value
= sizeof(__test
<_Tp
>(0)) == 1;
239 template <class T
> struct B1
{};
244 template <class U
> struct rebind
{typedef B1
<U
> other
;};
247 template <class T
, class U
> struct D1
{};
249 template <class T
, class U
>
252 template <class V
> struct rebind
{typedef D1
<V
, U
> other
;};
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
;