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