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 };