diff options
author | Eric Blake <eblake@redhat.com> | 2007-06-27 16:44:41 +0400 |
---|---|---|
committer | Eric Blake <eblake@redhat.com> | 2007-06-27 16:44:41 +0400 |
commit | 3473e6bd7b268deb4314659009512d846a75b368 (patch) | |
tree | 6ad0d0da98788ea8cab097e3ff0f908233da5161 /newlib | |
parent | 26e8e4befff225f93ed71f0f3182647cea975ecc (diff) |
Support __func__ in assert, as required by C99.
* libc/stdlib/assert.c (__assert_func): New function.
(__assert): Use __assert_func.
* libc/include/assert.h (assert) [!NDEBUG]: Use __assert_func when
possible.
Diffstat (limited to 'newlib')
-rw-r--r-- | newlib/ChangeLog | 14 | ||||
-rw-r--r-- | newlib/libc/include/assert.h | 35 | ||||
-rw-r--r-- | newlib/libc/stdlib/assert.c | 32 |
3 files changed, 57 insertions, 24 deletions
diff --git a/newlib/ChangeLog b/newlib/ChangeLog index 39bd297ea..7822a6edf 100644 --- a/newlib/ChangeLog +++ b/newlib/ChangeLog @@ -1,3 +1,11 @@ +2007-06-27 Eric Blake <ebb9@byu.net> + + Support __func__ in assert, as required by C99. + * libc/stdlib/assert.c (__assert_func): New function. + (__assert): Use __assert_func. + * libc/include/assert.h (assert) [!NDEBUG]: Use __assert_func when + possible. + 2007-06-20 Patrick Mansfield <patmans@us.ibm.com> * libc/machine/spu/perror.c: Pass errno as the second argument to @@ -11,7 +19,7 @@ 2007-06-20 Patrick Mansfield <patmans@us.ibm.com> * libc/include/sys/unistd.h[__SPU__]: Make fchdir prototype visible. - * libc/include/sys/stat.h[__SPU__]: Make mknod and lstat prototypes + * libc/include/sys/stat.h[__SPU__]: Make mknod and lstat prototypes visible. 2007-06-15 Patrick Mansfield <patmans@us.ibm.com> @@ -23,7 +31,7 @@ 2007-06-13 Patrick Mansfield <patmans@us.ibm.com> * libc/machine/spu/creat.c: New file copied from libc/posix/creat.c, - it just calls open with appropriate arguments. + it just calls open with appropriate arguments. * libc/machine/spu/Makefile.am: Add creat.c. * libc/machine/spu/Makefile.in: Regenerate. @@ -77,7 +85,7 @@ 2007-06-05 Christian Groessler <chris@groessler.org> - * libc/argz/argz_insert.c (argz_insert): Move delta variable + * libc/argz/argz_insert.c (argz_insert): Move delta variable declaration to top of function in keeping with C89 standard. 2007-06-04 Eric Blake <ebb9@byu.net> 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 */ +} |