1 // RUN: %clang %s -fsyntax-only -Xclang -verify -fblocks -Wunreachable-code -Wno-unused-value -Wno-covered-switch-default 2 3 int halt() __attribute__((noreturn)); 4 int live(); 5 int dead(); 6 7 void test1() { 8 goto c; 9 d: 10 goto e; // expected-warning {{will never be executed}} 11 c: ; 12 int i; 13 return; 14 goto b; // expected-warning {{will never be executed}} 15 goto a; // expected-warning {{will never be executed}} 16 b: 17 i = 1; 18 a: 19 i = 2; 20 goto f; 21 e: 22 goto d; 23 f: ; 24 } 25 26 void test2() { 27 int i; 28 switch (live()) { 29 case 1: 30 halt(), 31 dead(); // expected-warning {{will never be executed}} 32 33 case 2: 34 live(), halt(), 35 dead(); // expected-warning {{will never be executed}} 36 37 case 3: 38 live() 39 + // expected-warning {{will never be executed}} 40 halt(); 41 dead(); 42 43 case 4: 44 a4: 45 live(), 46 halt(); 47 goto a4; // expected-warning {{will never be executed}} 48 49 case 5: 50 goto a5; 51 c5: 52 dead(); // expected-warning {{will never be executed}} 53 goto b5; 54 a5: 55 live(), 56 halt(); 57 b5: 58 goto c5; 59 60 case 6: 61 if (live()) 62 goto e6; 63 live(), 64 halt(); 65 d6: 66 dead(); // expected-warning {{will never be executed}} 67 goto b6; 68 c6: 69 dead(); 70 goto b6; 71 e6: 72 live(), 73 halt(); 74 b6: 75 goto c6; 76 case 7: 77 halt() 78 + 79 dead(); // expected-warning {{will never be executed}} 80 - // expected-warning {{will never be executed}} 81 halt(); 82 case 8: 83 i 84 += // expected-warning {{will never be executed}} 85 halt(); 86 case 9: 87 halt() 88 ? // expected-warning {{will never be executed}} 89 dead() : dead(); 90 case 10: 91 ( // expected-warning {{will never be executed}} 92 float)halt(); 93 case 11: { 94 int a[5]; 95 live(), 96 a[halt() 97 ]; // expected-warning {{will never be executed}} 98 } 99 } 100 } 101 102 enum Cases { C1, C2, C3 }; 103 int test_enum_cases(enum Cases C) { 104 switch (C) { 105 case C1: 106 case C2: 107 case C3: 108 return 1; 109 default: { 110 int i = 0; // expected-warning{{will never be executed}} 111 ++i; 112 return i; 113 } 114 } 115 } 116 117 // Handle unreachable code triggered by macro expansions. 118 void __myassert_rtn(const char *, const char *, int, const char *) __attribute__((__noreturn__)); 119 120 #define myassert(e) \ 121 (__builtin_expect(!(e), 0) ? __myassert_rtn(__func__, __FILE__, __LINE__, #e) : (void)0) 122 123 void test_assert() { 124 myassert(0 && "unreachable"); 125 return; // no-warning 126 } 127 128 // Test case for PR 9774. Tests that dead code in macros aren't warned about. 129 #define MY_MAX(a,b) ((a) >= (b) ? (a) : (b)) 130 void PR9774(int *s) { 131 for (int i = 0; i < MY_MAX(2, 3); i++) // no-warning 132 s[i] = 0; 133 } 134 135 // Test case for <rdar://problem/11005770>. We should treat code guarded 136 // by 'x & 0' and 'x * 0' as unreachable. 137 void calledFun(); 138 void test_mul_and_zero(int x) { 139 if (x & 0) calledFun(); // expected-warning {{will never be executed}} 140 if (0 & x) calledFun(); // expected-warning {{will never be executed}} 141 if (x * 0) calledFun(); // expected-warning {{will never be executed}} 142 if (0 * x) calledFun(); // expected-warning {{will never be executed}} 143 } 144