diff options
Diffstat (limited to 'gcc-4.9/gcc/testsuite/gcc.dg/c11-noreturn-1.c')
-rw-r--r-- | gcc-4.9/gcc/testsuite/gcc.dg/c11-noreturn-1.c | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/gcc-4.9/gcc/testsuite/gcc.dg/c11-noreturn-1.c b/gcc-4.9/gcc/testsuite/gcc.dg/c11-noreturn-1.c new file mode 100644 index 000000000..e92c5ae04 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/gcc.dg/c11-noreturn-1.c @@ -0,0 +1,59 @@ +/* Test C11 _Noreturn. Test valid code. */ +/* { dg-do compile } */ +/* { dg-options "-std=c11 -pedantic-errors" } */ + +_Noreturn void exit (int); + +_Noreturn int f1 (void); + +_Noreturn void f2 (void); + +static void _Noreturn f3 (void) { exit (0); } + +/* Returning from a noreturn function is undefined at runtime, not a + constraint violation, but recommended practice is to diagnose if + such a return appears possible. */ + +_Noreturn int +f4 (void) +{ + return 1; /* { dg-warning "has a 'return' statement" } */ + /* { dg-warning "does return" "second warning" { target *-*-* } 20 } */ +} + +_Noreturn void +f5 (void) +{ + return; /* { dg-warning "has a 'return' statement" } */ + /* { dg-warning "does return" "second warning" { target *-*-* } 27 } */ +} + +_Noreturn void +f6 (void) +{ +} /* { dg-warning "does return" } */ + +_Noreturn void +f7 (int a) +{ + if (a) + exit (0); +} /* { dg-warning "does return" } */ + +/* Declarations need not all have _Noreturn. */ + +void f2 (void); + +void f8 (void); +_Noreturn void f8 (void); + +/* Duplicate _Noreturn is OK. */ +_Noreturn _Noreturn void _Noreturn f9 (void); + +/* _Noreturn does not affect type compatibility. */ + +void (*fp) (void) = f5; + +/* noreturn is an ordinary identifier. */ + +int noreturn; |