1 // RUN: %clang_cc1 -fsyntax-only -fcxx-exceptions -verify %s -std=c++14
2 
3 int FileScope;
4 
5 struct A {
6   int I;
7   void f();
AA8   A() try {
9   } catch (...) {
10     I = 12; // expected-warning {{cannot refer to a non-static member from the handler of a constructor function try block}}
11     f(); // expected-warning {{cannot refer to a non-static member from the handler of a constructor function try block}}
12 
13     FileScope = 12; // ok
14     A a;
15     a.I = 12; // ok
16   }
17 };
18 
19 struct B {
20   int I;
21   void f();
22 };
23 
24 struct C : B {
CC25   C() try {
26   } catch (...) {
27     I = 12; // expected-warning {{cannot refer to a non-static member from the handler of a constructor function try block}}
28     f(); // expected-warning {{cannot refer to a non-static member from the handler of a constructor function try block}}
29   }
30 };
31 
32 struct D {
33   static int I;
34   static void f();
35 
DD36   D() try {
37   } catch (...) {
38     I = 12; // ok
39     f(); // ok
40   }
41 };
42 int D::I;
43 
44 struct E {
45   int I;
46   void f();
47   static int J;
48   static void g();
49 
~EE50   ~E() try {
51   } catch (...) {
52     I = 12; // expected-warning {{cannot refer to a non-static member from the handler of a destructor function try block}}
53     f(); // expected-warning {{cannot refer to a non-static member from the handler of a destructor function try block}}
54 
55     J = 12; // ok
56     g(); // ok
57   }
58 };
59 int E::J;
60 
61 struct F {
62   static int I;
63   static void f();
64 };
65 int F::I;
66 
67 struct G : F {
GG68   G() try {
69   } catch (...) {
70     I = 12; // ok
71     f(); // ok
72   }
73 };
74 
75 struct H {
76   struct A {};
77   enum {
78     E
79   };
80 
HH81   H() try {
82   } catch (...) {
83     H::A a; // ok
84     int I = E; // ok
85   }
86 };
87 
88 struct I {
89   int J;
90 
II91   I() {
92     try { // not a function-try-block
93     } catch (...) {
94       J = 12; // ok
95 	}
96   }
97 };