| // RUN: %clang %s -fsyntax-only -Xclang -verify -fblocks -Wunreachable-code-aggressive -Wno-unused-value -Wno-covered-switch-default |
| |
| // This previously triggered a warning from -Wunreachable-code because of |
| // a busted CFG. |
| typedef signed char BOOL; |
| BOOL radar10989084() { |
| @autoreleasepool { // no-warning |
| return __objc_yes; |
| } |
| } |
| |
| // Test the warning works. |
| void test_unreachable() { |
| return; |
| return; // expected-warning {{will never be executed}} |
| } |
| |
| #define NO __objc_no |
| #define YES __objc_yes |
| #define CONFIG NO |
| |
| // Test that 'NO' and 'YES' are not treated as configuration macros. |
| int test_NO() { |
| if (NO) |
| return 1; // expected-warning {{will never be executed}} |
| else |
| return 0; |
| } |
| |
| int test_YES() { |
| if (YES) |
| return 1; |
| else |
| return 0; // expected-warning {{will never be executed}} |
| } |
| |
| int test_CONFIG() { |
| if (CONFIG) |
| return 1; |
| else |
| return 0; |
| } |
| |
| // FIXME: This should at some point report a warning |
| // that the loop increment is unreachable. |
| void test_loop_increment(id container) { |
| for (id x in container) { // no-warning |
| break; |
| } |
| } |
| |
| void calledFun() {} |
| |
| // Test "silencing" with parentheses. |
| void test_with_paren_silencing(int x) { |
| if (NO) calledFun(); // expected-warning {{will never be executed}} expected-note {{silence by adding parentheses to mark code as explicitly dead}} |
| if ((NO)) calledFun(); // no-warning |
| |
| if (YES) // expected-note {{silence by adding parentheses to mark code as explicitly dead}} |
| calledFun(); |
| else |
| calledFun(); // expected-warning {{will never be executed}} |
| |
| if ((YES)) |
| calledFun(); |
| else |
| calledFun(); // no-warning |
| |
| if (!YES) // expected-note {{silence by adding parentheses to mark code as explicitly dead}} |
| calledFun(); // expected-warning {{code will never be executed}} |
| else |
| calledFun(); |
| |
| if ((!YES)) |
| calledFun(); // no-warning |
| else |
| calledFun(); |
| |
| if (!(YES)) |
| calledFun(); // no-warning |
| else |
| calledFun(); |
| } |
| |