1/* Test C11 _Noreturn. Test valid code. */ 2/* { dg-do compile } */ 3/* { dg-options "-std=c11 -pedantic-errors" } */ 4 5_Noreturn void exit (int); 6 7_Noreturn int f1 (void); 8 9_Noreturn void f2 (void); 10 11static void _Noreturn f3 (void) { exit (0); } 12 13/* Returning from a noreturn function is undefined at runtime, not a 14 constraint violation, but recommended practice is to diagnose if 15 such a return appears possible. */ 16 17_Noreturn int 18f4 (void) 19{ 20 return 1; /* { dg-warning "has a 'return' statement" } */ 21 /* { dg-warning "does return" "second warning" { target *-*-* } 20 } */ 22} 23 24_Noreturn void 25f5 (void) 26{ 27 return; /* { dg-warning "has a 'return' statement" } */ 28 /* { dg-warning "does return" "second warning" { target *-*-* } 27 } */ 29} 30 31_Noreturn void 32f6 (void) 33{ 34} /* { dg-warning "does return" } */ 35 36_Noreturn void 37f7 (int a) 38{ 39 if (a) 40 exit (0); 41} /* { dg-warning "does return" } */ 42 43/* Declarations need not all have _Noreturn. */ 44 45void f2 (void); 46 47void f8 (void); 48_Noreturn void f8 (void); 49 50/* Duplicate _Noreturn is OK. */ 51_Noreturn _Noreturn void _Noreturn f9 (void); 52 53/* _Noreturn does not affect type compatibility. */ 54 55void (*fp) (void) = f5; 56 57/* noreturn is an ordinary identifier. */ 58 59int noreturn; 60