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. */
20 return 1; /* { dg-warning "has a 'return' statement" } */
21 /* { dg-warning "does return" "second warning" { target *-*-* } .-1 } */
27 return; /* { dg-warning "has a 'return' statement" } */
28 /* { dg-warning "does return" "second warning" { target *-*-* } .-1 } */
34 } /* { dg-warning "does return" } */
36 [[___Noreturn__
]] void
41 } /* { dg-warning "does return" } */
43 /* Declarations need not all have the attribute (buf if the first does not,
44 there is undefined behavior). */
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 ();