Skip to content
Snippets Groups Projects
Commit 71450d7f authored by Peter Eisentraut's avatar Peter Eisentraut
Browse files

Teach compiler that ereport(>=ERROR) does not return

When elevel >= ERROR, we add an abort() call to the ereport() macro to
give the compiler a hint that the ereport() expansion will not return,
but the abort() isn't actually reached because the longjmp happens in
errfinish().

Because the effect of ereport() varies with the elevel, we cannot use
standard compiler attributes such as noreturn for this.
parent ffdd5a0e
Branches
Tags
No related merge requests found
......@@ -100,11 +100,16 @@
* and have errstart insert the default text domain. Modules can either use
* ereport_domain() directly, or preferably they can override the TEXTDOMAIN
* macro.
*
* When elevel >= ERROR, we add an abort() call to give the compiler a hint
* that the ereport() expansion will not return, but the abort() isn't actually
* reached because the longjmp happens in errfinish().
*----------
*/
#define ereport_domain(elevel, domain, rest) \
(errstart(elevel, __FILE__, __LINE__, PG_FUNCNAME_MACRO, domain) ? \
(errfinish rest) : (void) 0)
(errfinish rest) : (void) 0), \
((elevel) >= ERROR ? abort() : (void) 0)
#define ereport(elevel, rest) \
ereport_domain(elevel, TEXTDOMAIN, rest)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment