| // RUN: %clang_cc1 %s -fcxx-exceptions -fexceptions -fsyntax-only -verify -fblocks -Wunreachable-code -Wno-unused-value |
| |
| int &halt() __attribute__((noreturn)); |
| int &live(); |
| int dead(); |
| int liveti() throw(int); |
| int (*livetip)() throw(int); |
| |
| int test1() { |
| try { |
| live(); |
| } catch (int i) { |
| live(); |
| } |
| return 1; |
| } |
| |
| void test2() { |
| try { |
| live(); |
| } catch (int i) { |
| live(); |
| } |
| try { |
| liveti(); |
| } catch (int i) { |
| live(); |
| } |
| try { |
| livetip(); |
| } catch (int i) { |
| live(); |
| } |
| throw 1; |
| dead(); // expected-warning {{will never be executed}} |
| } |
| |
| |
| void test3() { |
| halt() |
| --; // expected-warning {{will never be executed}} |
| // FIXME: The unreachable part is just the '?', but really all of this |
| // code is unreachable and shouldn't be separately reported. |
| halt() // expected-warning {{will never be executed}} |
| ? |
| dead() : dead(); |
| live(), |
| float |
| (halt()); // expected-warning {{will never be executed}} |
| } |
| |
| void test4() { |
| struct S { |
| int mem; |
| } s; |
| S &foor(); |
| halt(), foor()// expected-warning {{will never be executed}} |
| .mem; |
| } |
| |
| void test5() { |
| struct S { |
| int mem; |
| } s; |
| S &foor() __attribute__((noreturn)); |
| foor() |
| .mem; // expected-warning {{will never be executed}} |
| } |
| |
| void test6() { |
| struct S { |
| ~S() { } |
| S(int i) { } |
| }; |
| live(), |
| S |
| (halt()); // expected-warning {{will never be executed}} |
| } |