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 + + 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 * libc/machine/spu/perror.c: Pass errno as the second argument to @@ -11,7 +19,7 @@ 2007-06-20 Patrick Mansfield * 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 @@ -23,7 +31,7 @@ 2007-06-13 Patrick Mansfield * 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 - * 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 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 +# define assert(__e) ((__e) ? (void)0 : __assert_func (__FILE__, __LINE__, \ + __ASSERT_FUNC, #__e)) -#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 +# ifndef __ASSERT_FUNC + /* Use g++'s demangled names in C++. */ +# if defined __cplusplus && defined __GNUC__ +# define __ASSERT_FUNC __PRETTY_FUNCTION__ -#endif /* NDEBUG */ + /* C99 requires the use of __func__, gcc also supports it. */ +# elif defined __GNUC__ || __STDC_VERSION__ >= 199901L +# define __ASSERT_FUNC __func__ -void _EXFUN(__assert,(const char *, int, const char *)); + /* 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 void assert(int <[expression]>); -TRAD_SYNOPSIS - #include - 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 <>, 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 <> at compile time by defining <> as a @@ -48,15 +47,28 @@ Supporting OS subroutines required (only if enabled): <>, <>, #include #include +/* func can be NULL, in which case no function information is given. */ +void +_DEFUN (__assert_func, (file, line, func, failedexpr), + const char *file _AND + int line _AND + const char *func _AND + const char *failedexpr) +{ + 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) { - (void)fiprintf(stderr, - "assertion \"%s\" failed: file \"%s\", line %d\n", - failedexpr, file, line); - abort(); + __assert_func (file, line, NULL, failedexpr); /* NOTREACHED */ }