c++: Implement for namespace statics CWG 2867 - Order of initialization for structure...
[official-gcc.git] / gcc / testsuite / gcc.dg / c23-attr-noreturn-1.c
blob7142635cb64dd77e54cf696ac388ac0e433e83b5
1 /* Test C23 noreturn attribute: valid uses. */
2 /* { dg-do compile } */
3 /* { dg-options "-std=c23 -pedantic-errors" } */
5 [[noreturn]] void exit (int);
7 [[__noreturn__]] int f1 (void);
9 [[_Noreturn]] void f2 (void);
11 [[___Noreturn__]] static void f3 (void) { exit (0); }
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. */
17 [[noreturn]] int
18 f4 (void)
20 return 1; /* { dg-warning "has a 'return' statement" } */
21 /* { dg-warning "does return" "second warning" { target *-*-* } .-1 } */
24 [[__noreturn__]] void
25 f5 (void)
27 return; /* { dg-warning "has a 'return' statement" } */
28 /* { dg-warning "does return" "second warning" { target *-*-* } .-1 } */
31 [[_Noreturn]] void
32 f6 (void)
34 } /* { dg-warning "does return" } */
36 [[___Noreturn__]] void
37 f7 (int a)
39 if (a)
40 exit (0);
41 } /* { dg-warning "does return" } */
43 /* Declarations need not all have the attribute (buf if the first does not,
44 there is undefined behavior). */
46 void f2 (void);
48 /* Duplicate attribute, and use with _Noreturn, is OK. */
49 [[noreturn]] [[noreturn]] [[noreturn, __noreturn__]] void _Noreturn f9 (void);
51 /* The attribute does not affect type compatibility. */
53 void (*fp) (void) = f5;
55 /* Unlike the function specifier, the attribute may be used on main. */
56 [[noreturn]] int main ();