forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			97 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			97 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			C++
		
	
	
	
| // RUN: %clang_cc1 -fsyntax-only -fcxx-exceptions -verify %s -std=c++14
 | |
| 
 | |
| int FileScope;
 | |
| 
 | |
| struct A {
 | |
|   int I;
 | |
|   void f();
 | |
|   A() try {
 | |
|   } catch (...) {
 | |
|     I = 12; // expected-warning {{cannot refer to a non-static member from the handler of a constructor function try block}}
 | |
|     f(); // expected-warning {{cannot refer to a non-static member from the handler of a constructor function try block}}
 | |
| 
 | |
|     FileScope = 12; // ok
 | |
|     A a;
 | |
|     a.I = 12; // ok
 | |
|   }
 | |
| };
 | |
| 
 | |
| struct B {
 | |
|   int I;
 | |
|   void f();
 | |
| };
 | |
| 
 | |
| struct C : B {
 | |
|   C() try {
 | |
|   } catch (...) {
 | |
|     I = 12; // expected-warning {{cannot refer to a non-static member from the handler of a constructor function try block}}
 | |
|     f(); // expected-warning {{cannot refer to a non-static member from the handler of a constructor function try block}}
 | |
|   }
 | |
| };
 | |
| 
 | |
| struct D {
 | |
|   static int I;
 | |
|   static void f();
 | |
| 
 | |
|   D() try {
 | |
|   } catch (...) {
 | |
|     I = 12; // ok
 | |
|     f(); // ok
 | |
|   }
 | |
| };
 | |
| int D::I;
 | |
| 
 | |
| struct E {
 | |
|   int I;
 | |
|   void f();
 | |
|   static int J;
 | |
|   static void g();
 | |
| 
 | |
|   ~E() try {
 | |
|   } catch (...) {
 | |
|     I = 12; // expected-warning {{cannot refer to a non-static member from the handler of a destructor function try block}}
 | |
|     f(); // expected-warning {{cannot refer to a non-static member from the handler of a destructor function try block}}
 | |
| 
 | |
|     J = 12; // ok
 | |
|     g(); // ok
 | |
|   }
 | |
| };
 | |
| int E::J;
 | |
| 
 | |
| struct F {
 | |
|   static int I;
 | |
|   static void f();
 | |
| };
 | |
| int F::I;
 | |
| 
 | |
| struct G : F {
 | |
|   G() try {
 | |
|   } catch (...) {
 | |
|     I = 12; // ok
 | |
|     f(); // ok
 | |
|   }
 | |
| };
 | |
| 
 | |
| struct H {
 | |
|   struct A {};
 | |
|   enum {
 | |
|     E
 | |
|   };
 | |
| 
 | |
|   H() try {
 | |
|   } catch (...) {
 | |
|     H::A a; // ok
 | |
|     int I = E; // ok
 | |
|   }
 | |
| };
 | |
| 
 | |
| struct I {
 | |
|   int J;
 | |
| 
 | |
|   I() {
 | |
|     try { // not a function-try-block
 | |
|     } catch (...) {
 | |
|       J = 12; // ok
 | |
| 	}
 | |
|   }
 | |
| }; |