|  | // 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(); | 
|  | } | 
|  |  |