diff options
Diffstat (limited to 'newlib/libc')
-rw-r--r-- | newlib/libc/include/assert.h | 35 | ||||
-rw-r--r-- | newlib/libc/stdlib/assert.c | 32 |
2 files changed, 46 insertions, 21 deletions
diff --git a/newlib/libc/include/assert.h b/newlib/libc/include/assert.h index b681a8518..ed14928ba 100644 --- a/newlib/libc/include/assert.h +++ b/newlib/libc/include/assert.h @@ -11,18 +11,31 @@ extern "C" { #undef assert #ifdef NDEBUG /* required by ANSI standard */ -#define assert(p) ((void)0) +# define assert(__e) ((void)0) #else - -#ifdef __STDC__ -#define assert(e) ((e) ? (void)0 : __assert(__FILE__, __LINE__, #e)) -#else /* PCC */ -#define assert(e) ((e) ? (void)0 : __assert(__FILE__, __LINE__, "e")) -#endif - -#endif /* NDEBUG */ - -void _EXFUN(__assert,(const char *, int, const char *)); +# define assert(__e) ((__e) ? (void)0 : __assert_func (__FILE__, __LINE__, \ + __ASSERT_FUNC, #__e)) + +# ifndef __ASSERT_FUNC + /* Use g++'s demangled names in C++. */ +# if defined __cplusplus && defined __GNUC__ +# define __ASSERT_FUNC __PRETTY_FUNCTION__ + + /* C99 requires the use of __func__, gcc also supports it. */ +# elif defined __GNUC__ || __STDC_VERSION__ >= 199901L +# define __ASSERT_FUNC __func__ + + /* failed to detect __func__ support. */ +# else +# define __ASSERT_FUNC ((char *) 0) +# endif +# endif /* !__ASSERT_FUNC */ +#endif /* !NDEBUG */ + +void _EXFUN(__assert, (const char *, int, const char *) + _ATTRIBUTE ((__noreturn__))); +void _EXFUN(__assert_func, (const char *, int, const char *, const char *) + _ATTRIBUTE ((__noreturn__))); #ifdef __cplusplus } diff --git a/newlib/libc/stdlib/assert.c b/newlib/libc/stdlib/assert.c index c9887da5c..2da329815 100644 --- a/newlib/libc/stdlib/assert.c +++ b/newlib/libc/stdlib/assert.c @@ -9,11 +9,6 @@ ANSI_SYNOPSIS #include <assert.h> void assert(int <[expression]>); -TRAD_SYNOPSIS - #include <assert.h> - assert(<[expression]>) - int <[expression]>; - DESCRIPTION Use this macro to embed debuggging diagnostic statements in your programs. The argument <[expression]> should be an @@ -24,7 +19,11 @@ DESCRIPTION calls <<abort>>, after first printing a message showing what failed and where: -. Assertion failed: <[expression]>, file <[filename]>, line <[lineno]> +. Assertion failed: <[expression]>, file <[filename]>, line <[lineno]>, function: <[func]> + + If the name of the current function is not known (for example, + when using a C89 compiler that does not understand __func__), + the function location is omitted. The macro is defined to permit you to turn off all uses of <<assert>> at compile time by defining <<NDEBUG>> as a @@ -48,15 +47,28 @@ Supporting OS subroutines required (only if enabled): <<close>>, <<fstat>>, #include <stdlib.h> #include <stdio.h> +/* func can be NULL, in which case no function information is given. */ void -_DEFUN (__assert, (file, line, failedexpr), +_DEFUN (__assert_func, (file, line, func, failedexpr), const char *file _AND int line _AND + const char *func _AND const char *failedexpr) { - (void)fiprintf(stderr, - "assertion \"%s\" failed: file \"%s\", line %d\n", - failedexpr, file, line); + fiprintf(stderr, + "assertion \"%s\" failed: file \"%s\", line %d%s%s\n", + failedexpr, file, line, + func ? ", function: " : "", func ? func : ""); abort(); /* NOTREACHED */ } + +void +_DEFUN (__assert, (file, line, failedexpr), + const char *file _AND + int line _AND + const char *failedexpr) +{ + __assert_func (file, line, NULL, failedexpr); + /* NOTREACHED */ +} |