1 // RUN: %clang_cc1 %s -fcxx-exceptions -fexceptions -fsyntax-only -verify -fblocks -Wunreachable-code -Wno-unused-value 2 3 int &halt() __attribute__((noreturn)); 4 int &live(); 5 int dead(); 6 int liveti() throw(int); 7 int (*livetip)() throw(int); 8 test1()9int test1() { 10 try { 11 live(); 12 } catch (int i) { 13 live(); 14 } 15 return 1; 16 } 17 test2()18void test2() { 19 try { 20 live(); 21 } catch (int i) { 22 live(); 23 } 24 try { 25 liveti(); 26 } catch (int i) { 27 live(); 28 } 29 try { 30 livetip(); 31 } catch (int i) { 32 live(); 33 } 34 throw 1; 35 dead(); // expected-warning {{will never be executed}} 36 } 37 38 test3()39void test3() { 40 halt() 41 --; // expected-warning {{will never be executed}} 42 // FIXME: The unreachable part is just the '?', but really all of this 43 // code is unreachable and shouldn't be separately reported. 44 halt() // expected-warning {{will never be executed}} 45 ? 46 dead() : dead(); 47 live(), 48 float 49 (halt()); // expected-warning {{will never be executed}} 50 } 51 test4()52void test4() { 53 struct S { 54 int mem; 55 } s; 56 S &foor(); 57 halt(), foor()// expected-warning {{will never be executed}} 58 .mem; 59 } 60 test5()61void test5() { 62 struct S { 63 int mem; 64 } s; 65 S &foor() __attribute__((noreturn)); 66 foor() 67 .mem; // expected-warning {{will never be executed}} 68 } 69 test6()70void test6() { 71 struct S { 72 ~S() { } 73 S(int i) { } 74 }; 75 live(), 76 S 77 (halt()); // expected-warning {{will never be executed}} 78 } 79 80 // Don't warn about unreachable code in template instantiations, as 81 // they may only be unreachable in that specific instantiation. 82 void isUnreachable(); 83 test_unreachable_templates()84template <typename T> void test_unreachable_templates() { 85 T::foo(); 86 isUnreachable(); // no-warning 87 } 88 89 struct TestUnreachableA { 90 static void foo() __attribute__((noreturn)); 91 }; 92 struct TestUnreachableB { 93 static void foo(); 94 }; 95 test_unreachable_templates_harness()96void test_unreachable_templates_harness() { 97 test_unreachable_templates<TestUnreachableA>(); 98 test_unreachable_templates<TestUnreachableB>(); 99 } 100 101 // Do warn about explict template specializations, as they represent 102 // actual concrete functions that somebody wrote. 103 funcToSpecialize()104template <typename T> void funcToSpecialize() {} funcToSpecialize()105template <> void funcToSpecialize<int>() { 106 halt(); 107 dead(); // expected-warning {{will never be executed}} 108 } 109 110