1// RUN: %clang %s -fsyntax-only -Xclang -verify -fblocks -Wunreachable-code-aggressive -Wno-unused-value -Wno-covered-switch-default 2 3// This previously triggered a warning from -Wunreachable-code because of 4// a busted CFG. 5typedef signed char BOOL; 6BOOL radar10989084() { 7 @autoreleasepool { // no-warning 8 return __objc_yes; 9 } 10} 11 12// Test the warning works. 13void test_unreachable() { 14 return; 15 return; // expected-warning {{will never be executed}} 16} 17 18#define NO __objc_no 19#define YES __objc_yes 20#define CONFIG NO 21 22// Test that 'NO' and 'YES' are not treated as configuration macros. 23int test_NO() { 24 if (NO) 25 return 1; // expected-warning {{will never be executed}} 26 else 27 return 0; 28} 29 30int test_YES() { 31 if (YES) 32 return 1; 33 else 34 return 0; // expected-warning {{will never be executed}} 35} 36 37int test_CONFIG() { 38 if (CONFIG) 39 return 1; 40 else 41 return 0; 42} 43 44// FIXME: This should at some point report a warning 45// that the loop increment is unreachable. 46void test_loop_increment(id container) { 47 for (id x in container) { // no-warning 48 break; 49 } 50} 51 52void calledFun() {} 53 54// Test "silencing" with parentheses. 55void test_with_paren_silencing(int x) { 56 if (NO) calledFun(); // expected-warning {{will never be executed}} expected-note {{silence by adding parentheses to mark code as explicitly dead}} 57 if ((NO)) calledFun(); // no-warning 58 59 if (YES) // expected-note {{silence by adding parentheses to mark code as explicitly dead}} 60 calledFun(); 61 else 62 calledFun(); // expected-warning {{will never be executed}} 63 64 if ((YES)) 65 calledFun(); 66 else 67 calledFun(); // no-warning 68 69 if (!YES) // expected-note {{silence by adding parentheses to mark code as explicitly dead}} 70 calledFun(); // expected-warning {{code will never be executed}} 71 else 72 calledFun(); 73 74 if ((!YES)) 75 calledFun(); // no-warning 76 else 77 calledFun(); 78 79 if (!(YES)) 80 calledFun(); // no-warning 81 else 82 calledFun(); 83} 84 85