diff options
-rw-r--r-- | include/assert.h | 27 | ||||
-rw-r--r-- | libc/misc/assert/__assert.c | 15 |
2 files changed, 34 insertions, 8 deletions
diff --git a/include/assert.h b/include/assert.h index aef6cdf08..2612534cd 100644 --- a/include/assert.h +++ b/include/assert.h @@ -11,12 +11,35 @@ #else /* Not NDEBUG. */ -extern void __assert __P((const char *, const char *, int)); +extern void __assert __P((const char *, const char *, int, const char *)); #define assert(expr) \ ((void) ((expr) || \ (__assert (__STRING(expr), \ - __FILE__, __LINE__), 0))) + __FILE__, __LINE__, __ASSERT_FUNCTION), 0))) + + +/* Version 2.4 and later of GCC define a magical variable `__PRETTY_FUNCTION__' + which contains the name of the function currently being defined. +# define __ASSERT_FUNCTION __PRETTY_FUNCTION__ + This is broken in G++ before version 2.6. + C9x has a similar variable called __func__, but prefer the GCC one since + it demangles C++ function names. */ +# ifdef __GNUC__ +# if __GNUC__ > 2 || (__GNUC__ == 2 \ + && __GNUC_MINOR__ >= (defined __cplusplus ? 6 : 4)) +# define __ASSERT_FUNCTION __PRETTY_FUNCTION__ +# else +# define __ASSERT_FUNCTION ((__const char *) 0) +# endif +# else +# if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L +# define __ASSERT_FUNCTION __func__ +# else +# define __ASSERT_FUNCTION ((__const char *) 0) +# endif +# endif + #endif /* NDEBUG. */ diff --git a/libc/misc/assert/__assert.c b/libc/misc/assert/__assert.c index 2ce86c3f1..905671d98 100644 --- a/libc/misc/assert/__assert.c +++ b/libc/misc/assert/__assert.c @@ -15,17 +15,20 @@ const char *str; write(2, str, strlen(str)); } -void __assert(assertion, filename, linenumber) +void __assert(assertion, filename, linenumber, function) const char *assertion; const char *filename; int linenumber; +const char *function; { - errput("Failed assertion '"); - errput(assertion); - errput("' in file "); errput(filename); - errput(" at line "); + errput(":"); errput(itoa(linenumber)); - errput(".\n"); + errput(function ? ": " : ""); + errput(function ? function : ""); + errput(function ? "() " : ""); + errput(": Assertion \""); + errput(assertion); + errput("\" failed.\n"); abort(); } |