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>
* 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>

View File

@ -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
}

View File

@ -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_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 */
}