1 // RUN: %clang_cc1 %s -fsyntax-only -verify -fblocks -Wmissing-noreturn -Wno-unreachable-code 2 3 int j; test1()4void test1() { // expected-warning {{function 'test1' could be declared with attribute 'noreturn'}} 5 ^ (void) { while (1) { } }(); 6 ^ (void) { if (j) while (1) { } }(); 7 while (1) { } 8 } 9 test2()10void test2() { 11 if (j) while (1) { } 12 } 13 14 __attribute__((__noreturn__)) test2_positive()15void test2_positive() { 16 if (j) while (1) { } 17 } // expected-warning{{function declared 'noreturn' should not return}} 18 19 20 // This test case illustrates that we don't warn about the missing return 21 // because the function is marked noreturn and there is an infinite loop. 22 extern int foo_test_3(); test3(int arg)23__attribute__((__noreturn__)) void* test3(int arg) { 24 while (1) foo_test_3(); 25 } 26 test3_positive(int arg)27__attribute__((__noreturn__)) void* test3_positive(int arg) { 28 while (0) foo_test_3(); 29 } // expected-warning{{function declared 'noreturn' should not return}} 30 31 32 // PR5298 - -Wmissing-noreturn shouldn't warn if the function is already 33 // declared noreturn. 34 void __attribute__((noreturn)) test4()35test4() { 36 test2_positive(); 37 } 38 39 // Do not warn here. test5()40_Noreturn void test5() { 41 test2_positive(); 42 } 43 44 // rdar://16274746 test6()45void test6() 46 { 47 (void)^{ 48 for(;;) 49 ; 50 }; 51 } 52 53