forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			262 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			262 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			C++
		
	
	
	
| // RUN: %clang_cc1 -fsyntax-only -verify %s
 | |
| 
 | |
| template<typename T>
 | |
| struct X0 {
 | |
|   template<typename U> T f0(U);
 | |
|   template<typename U> U& f1(T*, U); // expected-error{{pointer to a reference}} \
 | |
|                                      // expected-note{{candidate}}
 | |
| };
 | |
| 
 | |
| X0<int> x0i;
 | |
| X0<void> x0v;
 | |
| X0<int&> x0ir; // expected-note{{instantiation}}
 | |
| 
 | |
| void test_X0(int *ip, double *dp) {
 | |
|   X0<int> xi;
 | |
|   int i1 = xi.f0(ip);
 | |
|   double *&dpr = xi.f1(ip, dp);
 | |
|   xi.f1(dp, dp); // expected-error{{no matching}}
 | |
| 
 | |
|   X0<void> xv;
 | |
|   double *&dpr2 = xv.f1(ip, dp);
 | |
| }
 | |
| 
 | |
| template<typename T>
 | |
| struct X1 {
 | |
|   template<typename U>
 | |
|   struct Inner0 {
 | |
|     U x; 
 | |
|     T y; // expected-error{{void}}
 | |
|   };
 | |
| 
 | |
|   template<typename U>
 | |
|   struct Inner1 {
 | |
|     U x; // expected-error{{void}}
 | |
|     T y;
 | |
|   };
 | |
|   
 | |
|   template<typename U>
 | |
|   struct Inner2 {
 | |
|     struct SuperInner {
 | |
|       U z; // expected-error{{void}}
 | |
|     };
 | |
|   };
 | |
|   
 | |
|   template<typename U>
 | |
|   struct Inner3 {
 | |
|     void f0(T t, U u) { // expected-note{{passing argument to parameter 't' here}}
 | |
|       (void)(t + u); // expected-error{{invalid operands}}
 | |
|     }
 | |
|     
 | |
|     template<typename V>
 | |
|     V f1(T t, U u, V) {
 | |
|       return t + u; // expected-error{{cannot initialize return object}}
 | |
|     }
 | |
|   };
 | |
|   
 | |
|   template<typename U>
 | |
|   struct Inner4;
 | |
| };
 | |
| 
 | |
| template<typename T>
 | |
| template<typename U>
 | |
| struct X1<T>::Inner4 {
 | |
|   template<typename V>
 | |
|   V f2(T t, U u, V);
 | |
|   
 | |
|   static U value;
 | |
| };
 | |
| 
 | |
| template<typename T>
 | |
| template<typename U>
 | |
| U X1<T>::Inner4<U>::value; // expected-error{{reference variable}}
 | |
| 
 | |
| template<typename T>
 | |
| template<typename U>
 | |
| template<typename V>
 | |
| V X1<T>::Inner4<U>::f2(T t, U u, V) {
 | |
|   return t + u; // expected-error{{cannot initialize return object}}
 | |
| }
 | |
| 
 | |
| void test_X1(int *ip, int i, double *dp) {
 | |
|   X1<void>::Inner0<int> *xvip; // okay
 | |
|   X1<void>::Inner0<int> xvi; // expected-note{{instantiation}}
 | |
|   
 | |
|   X1<int>::Inner1<void> *xivp; // okay
 | |
|   X1<int>::Inner1<void> xiv; // expected-note{{instantiation}}
 | |
|   
 | |
|   X1<int>::Inner2<void>::SuperInner *xisivp; // okay
 | |
|   X1<int>::Inner2<void>::SuperInner xisiv; // expected-note{{instantiation}}
 | |
|   
 | |
|   X1<int*>::Inner3<int> id3;
 | |
|   id3.f0(ip, i);
 | |
|   id3.f0(dp, i); // expected-error{{cannot initialize a parameter of type 'int *' with an lvalue of type 'double *'}}
 | |
|   id3.f1(ip, i, ip);
 | |
|   id3.f1(ip, i, dp); // expected-note{{instantiation}}
 | |
|   
 | |
|   X1<int*>::Inner3<double*> id3b;
 | |
|   id3b.f0(ip, dp); // expected-note{{instantiation}}
 | |
|   
 | |
|   X1<int*>::Inner4<int> id4;
 | |
|   id4.f2(ip, i, dp); // expected-note{{instantiation}}
 | |
|   
 | |
|   X1<int*>::Inner4<int>::value = 17;
 | |
|   i = X1<int*>::Inner4<int&>::value; // expected-note{{instantiation}}
 | |
| }
 | |
| 
 | |
| 
 | |
| template<typename T>
 | |
| struct X2 {
 | |
|   template<T *Ptr> // expected-error{{pointer to a reference}}
 | |
|   struct Inner;
 | |
|   
 | |
|   template<T Value> // expected-error{{cannot have type 'float'}}
 | |
|   struct Inner2;
 | |
| };
 | |
| 
 | |
| X2<int&> x2a; // expected-note{{instantiation}}
 | |
| X2<float> x2b; // expected-note{{instantiation}}
 | |
| 
 | |
| namespace N0 {
 | |
|   template<typename T>
 | |
|   struct X0 { };
 | |
|   
 | |
|   struct X1 {
 | |
|     template<typename T> void f(X0<T>& vals) { g(vals); }
 | |
|     template<typename T> void g(X0<T>& vals) { }
 | |
|   };
 | |
|   
 | |
|   void test(X1 x1, X0<int> x0i, X0<long> x0l) {
 | |
|     x1.f(x0i);
 | |
|     x1.f(x0l);
 | |
|   }  
 | |
| }
 | |
| 
 | |
| namespace PR6239 {
 | |
|   template <typename T>  
 | |
|   struct X0 {  
 | |
|     class type {
 | |
|       typedef T E;    
 | |
|       template <E e>  // subsitute T for E and bug goes away
 | |
|       struct sfinae {  };  
 | |
|       
 | |
|       template <class U>  
 | |
|       typename sfinae<&U::operator=>::type test(int);  
 | |
|     };
 | |
|   };
 | |
| 
 | |
|   template <typename T>  
 | |
|   struct X1 {  
 | |
|     typedef T E;    
 | |
|     template <E e>  // subsitute T for E and bug goes away
 | |
|     struct sfinae {  };  
 | |
|     
 | |
|     template <class U>  
 | |
|     typename sfinae<&U::operator=>::type test(int);  
 | |
|   };
 | |
| 
 | |
| }
 | |
| 
 | |
| namespace PR7587 {
 | |
|   template<typename> class X0;
 | |
|   template<typename> struct X1;
 | |
|   template<typename> class X2;
 | |
| 
 | |
|   template<typename T> class X3
 | |
|   {
 | |
|     template<
 | |
|       template<typename> class TT,
 | |
|       typename U = typename X1<T>::type
 | |
|     > 
 | |
|     struct Inner {
 | |
|       typedef X2<TT<typename X1<T>::type> > Type;
 | |
|     };
 | |
| 
 | |
|     const typename Inner<X0>::Type minCoeff() const;
 | |
|   };
 | |
| 
 | |
|   template<typename T> class X3<T*>
 | |
|   {
 | |
|     template<
 | |
|       template<typename> class TT,
 | |
|       typename U = typename X1<T>::type
 | |
|     > 
 | |
|     struct Inner {
 | |
|       typedef X2<TT<typename X1<T>::type> > Type;
 | |
|     };
 | |
| 
 | |
|     const typename Inner<X0>::Type minCoeff() const;
 | |
|   };
 | |
| 
 | |
| }
 | |
| 
 | |
| namespace PR7669 {
 | |
|   template<class> struct X {
 | |
|     template<class> struct Y {
 | |
|       template<int,class> struct Z;
 | |
|       template<int Dummy> struct Z<Dummy,int> {};
 | |
|     };
 | |
|   };
 | |
| 
 | |
|   void a()
 | |
|   {
 | |
|     X<int>::Y<int>::Z<0,int>();
 | |
|   }
 | |
| }
 | |
| 
 | |
| namespace PR8489 {
 | |
|   template <typename CT>
 | |
|   class C {
 | |
|     template<typename FT>
 | |
|     void F() {} // expected-note{{FT}}
 | |
|   };
 | |
|   void f() {
 | |
|     C<int> c;
 | |
|     c.F(); // expected-error{{no matching member function}}
 | |
|   }
 | |
| }
 | |
| 
 | |
| namespace rdar8986308 {
 | |
|   template <bool> struct __static_assert_test;
 | |
|   template <> struct __static_assert_test<true> {};
 | |
|   template <unsigned> struct __static_assert_check {};
 | |
| 
 | |
|   namespace std {
 | |
| 
 | |
|     template <class _Tp, class _Up>
 | |
|     struct __has_rebind
 | |
|     {
 | |
|     private:
 | |
|       struct __two {char _; char __;};
 | |
|       template <class _Xp> static __two __test(...);
 | |
|       template <class _Xp> static char __test(typename _Xp::template rebind<_Up>* = 0);
 | |
|     public:
 | |
|       static const bool value = sizeof(__test<_Tp>(0)) == 1;
 | |
|     };
 | |
| 
 | |
|   }
 | |
| 
 | |
|   template <class T> struct B1 {};
 | |
| 
 | |
|   template <class T>
 | |
|   struct B
 | |
|   {
 | |
|     template <class U> struct rebind {typedef B1<U> other;};
 | |
|   };
 | |
| 
 | |
|   template <class T, class U> struct D1 {};
 | |
| 
 | |
|   template <class T, class U>
 | |
|   struct D
 | |
|   {
 | |
|     template <class V> struct rebind {typedef D1<V, U> other;};
 | |
|   };
 | |
| 
 | |
|   int main()
 | |
|   {
 | |
|     typedef __static_assert_check<sizeof(__static_assert_test<((std::__has_rebind<B<int>, double>::value))>)> __t64;
 | |
|     typedef __static_assert_check<sizeof(__static_assert_test<((std::__has_rebind<D<char, int>, double>::value))>)> __t64;
 | |
|   }
 | |
| 
 | |
| }
 |