forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			105 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			105 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C++
		
	
	
	
| // RUN: %clang_cc1 -fsyntax-only -verify %s
 | |
| 
 | |
| template<typename T>
 | |
| struct X {
 | |
|   int x;
 | |
|   T y; // expected-error{{data member instantiated with function type}}
 | |
|   T* z;
 | |
|   T bitfield : 12; // expected-error{{bit-field 'bitfield' has non-integral type 'float'}} \
 | |
|                   // expected-error{{data member instantiated with function type}}
 | |
| 
 | |
|   mutable T x2; // expected-error{{data member instantiated with function type}}
 | |
| };
 | |
| 
 | |
| void test1(const X<int> *xi) {
 | |
|   int i1 = xi->x;
 | |
|   const int &i2 = xi->y;
 | |
|   int* ip1 = xi->z;
 | |
|   int i3 = xi->bitfield;
 | |
|   xi->x2 = 17;
 | |
| }
 | |
| 
 | |
| void test2(const X<float> *xf) {
 | |
|   (void)xf->x; // expected-note{{in instantiation of template class 'X<float>' requested here}}
 | |
| }
 | |
| 
 | |
| void test3(const X<int(int)> *xf) {
 | |
|   (void)xf->x; // expected-note{{in instantiation of template class 'X<int (int)>' requested here}}
 | |
| }
 | |
| 
 | |
| namespace PR7123 {
 | |
|   template <class > struct requirement_;
 | |
| 
 | |
|   template <void(*)()> struct instantiate
 | |
|   { };
 | |
| 
 | |
|   template <class > struct requirement ;
 | |
|   struct failed ;
 | |
| 
 | |
|   template <class Model> struct requirement<failed *Model::*>
 | |
|   {
 | |
|     static void failed()
 | |
|     {
 | |
|       ((Model*)0)->~Model(); // expected-note{{in instantiation of}}
 | |
|     }
 | |
|   };
 | |
| 
 | |
|   template <class Model> struct requirement_<void(*)(Model)> : requirement<failed *Model::*>
 | |
|   { };
 | |
| 
 | |
|   template <int> struct Requires_
 | |
|   { typedef void type; };
 | |
| 
 | |
|   template <class Model> struct usage_requirements
 | |
|   {
 | |
|     ~usage_requirements()
 | |
|     {((Model*)0)->~Model(); } // expected-note{{in instantiation of}}
 | |
|   };
 | |
| 
 | |
|   template < typename TT > struct BidirectionalIterator
 | |
|   {
 | |
|     enum
 | |
|       { value = 0 };
 | |
|   
 | |
|     instantiate< requirement_<void(*)(usage_requirements<BidirectionalIterator>)>::failed> int534; // expected-note{{in instantiation of}}
 | |
|   
 | |
|     ~BidirectionalIterator()
 | |
|     { i--; } // expected-error{{cannot decrement value of type 'PR7123::X'}}
 | |
|   
 | |
|     TT i;
 | |
|   };
 | |
| 
 | |
|   struct X
 | |
|   { };
 | |
| 
 | |
|   template<typename RanIter> 
 | |
|   typename Requires_< BidirectionalIterator<RanIter>::value >::type sort(RanIter,RanIter){}
 | |
| 
 | |
|   void f()
 | |
|   {
 | |
|     X x;
 | |
|     sort(x,x);
 | |
|   }
 | |
| }
 | |
| 
 | |
| namespace PR7355 {
 | |
|   template<typename T1> class A {
 | |
|     class D; // expected-note{{declared here}}
 | |
|     D d; //expected-error{{implicit instantiation of undefined member 'PR7355::A<int>::D'}}
 | |
|   };
 | |
| 
 | |
|   A<int> ai; // expected-note{{in instantiation of}}
 | |
| }
 | |
| 
 | |
| namespace PR8712 {
 | |
|   template <int dim>
 | |
|   class B {
 | |
|   public:
 | |
|     B(const unsigned char i);
 | |
|     unsigned char value : (dim > 0 ? dim : 1);
 | |
|   };
 | |
| 
 | |
|   template <int dim>
 | |
|   inline B<dim>::B(const unsigned char i) : value(i) {}
 | |
| }
 |