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