45 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			45 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			C++
		
	
	
	
| // RUN: %clang_cc1 -std=c++11 %s -verify -fno-spell-checking
 | |
| 
 | |
| // These test cases are constructed to make clang call ActOnStartOfFunctionDef
 | |
| // with nullptr.
 | |
| 
 | |
| struct ImplicitDefaultCtor1 {};
 | |
| struct Foo {
 | |
|   typedef int NameInClass;
 | |
|   void f();
 | |
| };
 | |
| namespace bar {
 | |
| // FIXME: Improved our recovery to make this a redeclaration of Foo::f,
 | |
| // even though this is in the wrong namespace. That will allow name lookup to
 | |
| // find NameInClass below. Users are likely to hit this when they forget to
 | |
| // close namespaces.
 | |
| // expected-error@+1 {{cannot define or redeclare 'f' here}}
 | |
| void Foo::f() {
 | |
|   switch (0) { case 0: ImplicitDefaultCtor1 o; }
 | |
|   // expected-error@+1 {{unknown type name 'NameInClass'}}
 | |
|   NameInClass var;
 | |
| }
 | |
| } // namespace bar
 | |
| 
 | |
| struct ImplicitDefaultCtor2 {};
 | |
| template <typename T> class TFoo { void f(); };
 | |
| // expected-error@+1 {{nested name specifier 'decltype(TFoo<T>())::'}}
 | |
| template <typename T> void decltype(TFoo<T>())::f() {
 | |
|   switch (0) { case 0: ImplicitDefaultCtor1 o; }
 | |
| }
 | |
| 
 | |
| namespace tpl2 {
 | |
| struct ImplicitDefaultCtor3 {};
 | |
| template <class T1> class A {
 | |
|   template <class T2> class B {
 | |
|     void mf2();
 | |
|   };
 | |
| };
 | |
| template <class Y>
 | |
| template <>
 | |
| // expected-error@+1 {{nested name specifier 'A<Y>::B<double>::'}}
 | |
| void A<Y>::B<double>::mf2() {
 | |
|   switch (0) { case 0: ImplicitDefaultCtor3 o; }
 | |
| }
 | |
| }
 |