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.
This commit is contained in:
Eric Blake 2007-06-27 12:44:41 +00:00
parent 26e8e4beff
commit 3473e6bd7b
3 changed files with 54 additions and 21 deletions

View File

@ -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> 2007-06-20 Patrick Mansfield <patmans@us.ibm.com>
* libc/machine/spu/perror.c: Pass errno as the second argument to * 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> 2007-06-20 Patrick Mansfield <patmans@us.ibm.com>
* libc/include/sys/unistd.h[__SPU__]: Make fchdir prototype visible. * 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. visible.
2007-06-15 Patrick Mansfield <patmans@us.ibm.com> 2007-06-15 Patrick Mansfield <patmans@us.ibm.com>
@ -23,7 +31,7 @@
2007-06-13 Patrick Mansfield <patmans@us.ibm.com> 2007-06-13 Patrick Mansfield <patmans@us.ibm.com>
* libc/machine/spu/creat.c: New file copied from libc/posix/creat.c, * 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.am: Add creat.c.
* libc/machine/spu/Makefile.in: Regenerate. * libc/machine/spu/Makefile.in: Regenerate.
@ -77,7 +85,7 @@
2007-06-05 Christian Groessler <chris@groessler.org> 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. declaration to top of function in keeping with C89 standard.
2007-06-04 Eric Blake <ebb9@byu.net> 2007-06-04 Eric Blake <ebb9@byu.net>

View File

@ -11,18 +11,31 @@ extern "C" {
#undef assert #undef assert
#ifdef NDEBUG /* required by ANSI standard */ #ifdef NDEBUG /* required by ANSI standard */
#define assert(p) ((void)0) # define assert(__e) ((void)0)
#else #else
# define assert(__e) ((__e) ? (void)0 : __assert_func (__FILE__, __LINE__, \
__ASSERT_FUNC, #__e))
#ifdef __STDC__ # ifndef __ASSERT_FUNC
#define assert(e) ((e) ? (void)0 : __assert(__FILE__, __LINE__, #e)) /* Use g++'s demangled names in C++. */
#else /* PCC */ # if defined __cplusplus && defined __GNUC__
#define assert(e) ((e) ? (void)0 : __assert(__FILE__, __LINE__, "e")) # define __ASSERT_FUNC __PRETTY_FUNCTION__
#endif
#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 #ifdef __cplusplus
} }

View File

@ -9,11 +9,6 @@ ANSI_SYNOPSIS
#include <assert.h> #include <assert.h>
void assert(int <[expression]>); void assert(int <[expression]>);
TRAD_SYNOPSIS
#include <assert.h>
assert(<[expression]>)
int <[expression]>;
DESCRIPTION DESCRIPTION
Use this macro to embed debuggging diagnostic statements in Use this macro to embed debuggging diagnostic statements in
your programs. The argument <[expression]> should be an your programs. The argument <[expression]> should be an
@ -24,7 +19,11 @@ DESCRIPTION
calls <<abort>>, after first printing a message showing what calls <<abort>>, after first printing a message showing what
failed and where: 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 The macro is defined to permit you to turn off all uses of
<<assert>> at compile time by defining <<NDEBUG>> as a <<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 <stdlib.h>
#include <stdio.h> #include <stdio.h>
/* 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 void
_DEFUN (__assert, (file, line, failedexpr), _DEFUN (__assert, (file, line, failedexpr),
const char *file _AND const char *file _AND
int line _AND int line _AND
const char *failedexpr) const char *failedexpr)
{ {
(void)fiprintf(stderr, __assert_func (file, line, NULL, failedexpr);
"assertion \"%s\" failed: file \"%s\", line %d\n",
failedexpr, file, line);
abort();
/* NOTREACHED */ /* NOTREACHED */
} }