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