37 lines
		
	
	
		
			1016 B
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			37 lines
		
	
	
		
			1016 B
		
	
	
	
		
			C++
		
	
	
	
| // RUN: %clang_cc1 -fsyntax-only -verify %s
 | |
| 
 | |
| // This is not well-formed C++ but used to crash in sema.
 | |
| 
 | |
| template <class T>
 | |
| struct X {
 | |
|   template <class U>
 | |
|   struct A { // expected-note {{not-yet-instantiated member is declared here}}
 | |
|     template <class V>
 | |
|     struct B {
 | |
|       template <class W>
 | |
|       struct C {
 | |
|         template <class X>
 | |
|         struct D {
 | |
|           template <class Y>
 | |
|           struct E {
 | |
|             template <class Z>
 | |
|             void operator+=(Z);
 | |
|           };
 | |
|         };
 | |
|       };
 | |
|     };
 | |
|   };
 | |
| 
 | |
|   template <class U>
 | |
|   template <class V>
 | |
|   template <class W>
 | |
|   template <class X>
 | |
|   template <class Y>
 | |
|   template <class Z>
 | |
|   friend void A<U>::template B<V>::template C<W>::template D<X>::template E<Y>::operator+=(Z); // expected-warning {{not supported}} expected-error {{no member 'A' in 'X<int>'; it has not yet been instantiated}}
 | |
| };
 | |
| 
 | |
| void test() {
 | |
|   X<int>::A<int>::B<int>::C<int>::D<int>::E<int>() += 1.0; // expected-note {{in instantiation of template class 'X<int>' requested here}}
 | |
| }
 |