| // RUN: %clang_cc1 %s -fsyntax-only -verify -fblocks -Wmissing-noreturn -Wno-unreachable-code | 
 |  | 
 | int j; | 
 | void test1() { // expected-warning {{function 'test1' could be declared with attribute 'noreturn'}} | 
 |   ^ (void) { while (1) { } }(); | 
 |   ^ (void) { if (j) while (1) { } }(); | 
 |   while (1) { } | 
 | } | 
 |  | 
 | void test2() { | 
 |   if (j) while (1) { } | 
 | } | 
 |  | 
 | __attribute__((__noreturn__)) | 
 | void test2_positive() { | 
 |   if (j) while (1) { } | 
 | } // expected-warning{{function declared 'noreturn' should not return}} | 
 |  | 
 |  | 
 | // This test case illustrates that we don't warn about the missing return | 
 | // because the function is marked noreturn and there is an infinite loop. | 
 | extern int foo_test_3(); | 
 | __attribute__((__noreturn__)) void* test3(int arg) { | 
 |   while (1) foo_test_3(); | 
 | } | 
 |  | 
 | __attribute__((__noreturn__)) void* test3_positive(int arg) { | 
 |   while (0) foo_test_3(); | 
 | } // expected-warning{{function declared 'noreturn' should not return}} | 
 |  | 
 |  | 
 | // PR5298 - -Wmissing-noreturn shouldn't warn if the function is already | 
 | // declared noreturn. | 
 | void __attribute__((noreturn)) | 
 | test4() { | 
 |   test2_positive(); | 
 | } | 
 |  | 
 | // Do not warn here. | 
 | _Noreturn void test5() { | 
 |   test2_positive(); | 
 | } | 
 |  | 
 | // rdar://16274746 | 
 | void test6() | 
 | { | 
 |     (void)^{  | 
 |        for(;;) | 
 |         ; | 
 |      }; | 
 | } | 
 |  |