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