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:
		| @@ -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,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")) | ||||
| # 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 */ | ||||
|  | ||||
| #endif /* NDEBUG */ | ||||
|  | ||||
| void _EXFUN(__assert,(const char *, int, const char *)); | ||||
| 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 | ||||
| } | ||||
|   | ||||
| @@ -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 */ | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user