add _Noreturn function attribute, with fallback for pre-C11 GNUC
authorRich Felker <dalias@aerifal.cx>
Fri, 7 Sep 2012 03:12:27 +0000 (23:12 -0400)
committerRich Felker <dalias@aerifal.cx>
Fri, 7 Sep 2012 03:12:27 +0000 (23:12 -0400)
include/setjmp.h
include/stdlib.h
src/exit/_Exit.c
src/exit/abort.c
src/exit/exit.c
src/exit/quick_exit.c

index 7dc72767db832ec9b5930bd5fa9f072e97300eb0..8ec5c6f185705390dbbf56a78e0010e04ad1a8a0 100644 (file)
@@ -5,6 +5,13 @@
 extern "C" {
 #endif
 
+#if __STDC_VERSION__ >= 201112L
+#elif defined(__GNUC__)
+#define _Noreturn __attribute__((__noreturn__))
+#else
+#define _Noreturn
+#endif
+
 #include <bits/setjmp.h>
 
 
@@ -29,7 +36,7 @@ void _longjmp (jmp_buf, int);
 
 
 int setjmp (jmp_buf);
-void longjmp (jmp_buf, int);
+_Noreturn void longjmp (jmp_buf, int);
 
 #define setjmp setjmp
 #define longjmp longjmp
index 14cc71bba4bff428854bd77bb9a5af7fe9e08673..86cf017165440824f719b7508fe3971f6274a05d 100644 (file)
@@ -11,6 +11,13 @@ extern "C" {
 #define __restrict
 #endif
 
+#if __STDC_VERSION__ >= 201112L
+#elif defined(__GNUC__)
+#define _Noreturn __attribute__((__noreturn__))
+#else
+#define _Noreturn
+#endif
+
 #undef NULL
 #ifdef __cplusplus
 #define NULL 0
@@ -46,12 +53,12 @@ void *realloc (void *, size_t);
 void free (void *);
 void *aligned_alloc(size_t alignment, size_t size);
 
-void abort (void);
+_Noreturn void abort (void);
 int atexit (void (*) (void));
-void exit (int);
-void _Exit (int);
+_Noreturn void exit (int);
+_Noreturn void _Exit (int);
 int at_quick_exit (void (*) (void));
-void quick_exit (int);
+_Noreturn void quick_exit (int);
 
 char *getenv (const char *);
 
index 6ceb14371cff7b29216b2d573fd083e1396e95cf..c00a2ffbc798b2a5243c017d9b5292fb2afcc2bb 100644 (file)
@@ -1,7 +1,7 @@
 #include <stdlib.h>
 #include "syscall.h"
 
-void _Exit(int ec)
+_Noreturn void _Exit(int ec)
 {
        __syscall(SYS_exit_group, ec);
        __syscall(SYS_exit, ec);
index c5b9e5264f47eaf5cbaf6b198ddf70565d567f73..203dd35cb99d23b16a31409b149df824950b73f9 100644 (file)
@@ -2,7 +2,7 @@
 #include <signal.h>
 #include "syscall.h"
 
-void abort(void)
+_Noreturn void abort(void)
 {
        raise(SIGABRT);
        raise(SIGKILL);
index e4aeaf1589938da1f886fb740a7b46a76f94a275..e4932b5b229a9708e23a6e409082562da58f11ab 100644 (file)
@@ -14,7 +14,7 @@ weak_alias(dummy, __funcs_on_exit);
 weak_alias(dummy, __flush_on_exit);
 weak_alias(dummy, __seek_on_exit);
 
-void exit(int code)
+_Noreturn void exit(int code)
 {
        static int lock;
 
index 18d5288a709faabc773297590676a7281094165d..1175d80cc49d3c8395101f6712726676ccf636e2 100644 (file)
@@ -6,7 +6,7 @@
 static void dummy() { }
 weak_alias(dummy, __funcs_on_quick_exit);
 
-void quick_exit(int code)
+_Noreturn void quick_exit(int code)
 {
        static int lock;
        while (a_swap(&lock, 1)) __syscall(SYS_pause);