1 // RUN: %clang_cc1 -fsyntax-only -verify %s 2 3 // Reachability tests have to come first because they get suppressed 4 // if any errors have occurred. 5 namespace test5 { 6 struct A { 7 __attribute__((noreturn)) void fail(); 8 void nofail(); 9 } a; 10 11 int &test1() { 12 a.nofail(); 13 } // expected-warning {{control reaches end of non-void function}} 14 15 int &test2() { 16 a.fail(); 17 } 18 } 19 20 // PR5620 21 void f0() __attribute__((__noreturn__)); 22 void f1(void (*)()); 23 void f2() { f1(f0); } 24 25 // Taking the address of a noreturn function 26 void test_f0a() { 27 void (*fp)() = f0; 28 void (*fp1)() __attribute__((noreturn)) = f0; 29 } 30 31 // Taking the address of an overloaded noreturn function 32 void f0(int) __attribute__((__noreturn__)); 33 34 void test_f0b() { 35 void (*fp)() = f0; 36 void (*fp1)() __attribute__((noreturn)) = f0; 37 } 38 39 // No-returned function pointers 40 typedef void (* noreturn_fp)() __attribute__((noreturn)); 41 42 void f3(noreturn_fp); // expected-note{{candidate function}} 43 44 void test_f3() { 45 f3(f0); // okay 46 f3(f2); // expected-error{{no matching function for call}} 47 } 48 49 50 class xpto { 51 int blah() __attribute__((noreturn)); 52 }; 53 54 int xpto::blah() { 55 return 3; // expected-warning {{function 'blah' declared 'noreturn' should not return}} 56 } 57 58 // PR12948 59 60 namespace PR12948 { 61 template<int> 62 void foo() __attribute__((__noreturn__)); 63 64 template<int> 65 void foo() { 66 while (1) continue; 67 } 68 69 void bar() __attribute__((__noreturn__)); 70 71 void bar() { 72 foo<0>(); 73 } 74 75 76 void baz() __attribute__((__noreturn__)); 77 typedef void voidfn(); 78 voidfn baz; 79 80 template<typename> void wibble() __attribute__((__noreturn__)); 81 template<typename> voidfn wibble; 82 } 83