restore _Noreturn to __assert_fail
authorRich Felker <dalias@aerifal.cx>
Tue, 30 Aug 2016 20:39:54 +0000 (16:39 -0400)
committerRich Felker <dalias@aerifal.cx>
Tue, 30 Aug 2016 20:39:54 +0000 (16:39 -0400)
this reverts commit 2c1f8fd5da3306fd7c8a2267467e44eb61f12dd4. without
the _Noreturn attribute, the compiler cannot use asserts to perform
reachability/range analysis. this leads to missed optimizations and
spurious warnings.

the original backtrace problem that prompted the removal of _Noreturn
was not clearly documented at the time, but it seems to happen only
when libc was built without -g, which also breaks many other
backtracing cases.

include/assert.h
src/exit/assert.c

index e679adbf8338ed3280230089fa4e2c871e27a129..d14ec94e7a263b2cbaa3a72b9ff09dc9d8807886 100644 (file)
@@ -16,7 +16,7 @@
 extern "C" {
 #endif
 
-void __assert_fail (const char *, const char *, int, const char *);
+_Noreturn void __assert_fail (const char *, const char *, int, const char *);
 
 #ifdef __cplusplus
 }
index e87442a7c50d9ca8fdf267d7c6038780941c56d3..49b0dc3ec434c68a92ad3c38f087aec74c45e4e3 100644 (file)
@@ -1,7 +1,7 @@
 #include <stdio.h>
 #include <stdlib.h>
 
-void __assert_fail(const char *expr, const char *file, int line, const char *func)
+_Noreturn void __assert_fail(const char *expr, const char *file, int line, const char *func)
 {
        fprintf(stderr, "Assertion failed: %s (%s: %s: %d)\n", expr, file, func, line);
        fflush(NULL);