diff --git a/src/backend/utils/error/assert.c b/src/backend/utils/error/assert.c index fd334a1947..a2d455b397 100644 --- a/src/backend/utils/error/assert.c +++ b/src/backend/utils/error/assert.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/error/assert.c,v 1.33 2007/01/05 22:19:43 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/utils/error/assert.c,v 1.34 2007/05/04 02:01:02 tgl Exp $ * * NOTE * This should eventually work with elog() @@ -21,11 +21,14 @@ /* * ExceptionalCondition - Handles the failure of an Assert() + * + * Note: this can't actually return, but we declare it as returning int + * because the TrapMacro() macro might get wonky otherwise. */ int -ExceptionalCondition(char *conditionName, - char *errorType, - char *fileName, +ExceptionalCondition(const char *conditionName, + const char *errorType, + const char *fileName, int lineNumber) { if (!PointerIsValid(conditionName) @@ -39,6 +42,9 @@ ExceptionalCondition(char *conditionName, fileName, lineNumber); } + /* Usually this shouldn't be needed, but make sure the msg went out */ + fflush(stderr); + #ifdef SLEEP_ON_ASSERT /* diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c index d74442ee54..93e7663da3 100644 --- a/src/backend/utils/error/elog.c +++ b/src/backend/utils/error/elog.c @@ -42,7 +42,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/error/elog.c,v 1.184 2007/05/02 15:32:41 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/utils/error/elog.c,v 1.185 2007/05/04 02:01:02 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -1151,6 +1151,16 @@ pg_re_throw(void) errfinish(0); } + + /* We mustn't return... */ + ExceptionalCondition("pg_re_throw tried to return", "FailedAssertion", + __FILE__, __LINE__); + + /* + * Since ExceptionalCondition isn't declared noreturn because of + * TrapMacro(), we need this to keep gcc from complaining. + */ + abort(); } diff --git a/src/include/postgres.h b/src/include/postgres.h index 1ff0e97e9b..27c21e2bcc 100644 --- a/src/include/postgres.h +++ b/src/include/postgres.h @@ -10,7 +10,7 @@ * Portions Copyright (c) 1996-2007, PostgreSQL Global Development Group * Portions Copyright (c) 1995, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/postgres.h,v 1.79 2007/04/06 04:21:44 tgl Exp $ + * $PostgreSQL: pgsql/src/include/postgres.h,v 1.80 2007/05/04 02:01:02 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -694,8 +694,9 @@ extern DLLIMPORT bool assert_enabled; Trap(!(condition), "BadState") #endif /* USE_ASSERT_CHECKING */ -extern int ExceptionalCondition(char *conditionName, char *errorType, - char *fileName, int lineNumber); +extern int ExceptionalCondition(const char *conditionName, + const char *errorType, + const char *fileName, int lineNumber); /* ---------------------------------------------------------------- * Section 4: genbki macros used by catalog/pg_xxx.h files diff --git a/src/include/utils/elog.h b/src/include/utils/elog.h index e84d67345f..6a4809a339 100644 --- a/src/include/utils/elog.h +++ b/src/include/utils/elog.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2007, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/utils/elog.h,v 1.85 2007/05/02 15:32:42 tgl Exp $ + * $PostgreSQL: pgsql/src/include/utils/elog.h,v 1.86 2007/05/04 02:01:02 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -222,8 +222,17 @@ extern DLLIMPORT ErrorContextCallback *error_context_stack; error_context_stack = save_context_stack; \ } while (0) +/* + * gcc understands __attribute__((noreturn)); for other compilers, insert + * a useless exit() call so that the compiler gets the point. + */ +#ifdef __GNUC__ #define PG_RE_THROW() \ pg_re_throw() +#else +#define PG_RE_THROW() \ + (pg_re_throw(), exit(1)) +#endif extern DLLIMPORT sigjmp_buf *PG_exception_stack; @@ -262,7 +271,7 @@ extern ErrorData *CopyErrorData(void); extern void FreeErrorData(ErrorData *edata); extern void FlushErrorState(void); extern void ReThrowError(ErrorData *edata); -extern void pg_re_throw(void); +extern void pg_re_throw(void) __attribute__((noreturn)); /* GUC-configurable parameters */