]> granicus.if.org Git - postgresql/commitdiff
Teach compiler that ereport(>=ERROR) does not return
authorPeter Eisentraut <peter_e@gmx.net>
Tue, 21 Aug 2012 04:03:32 +0000 (00:03 -0400)
committerPeter Eisentraut <peter_e@gmx.net>
Tue, 21 Aug 2012 04:03:32 +0000 (00:03 -0400)
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.

src/include/utils/elog.h

index 1bbfd2b958f07a6b63dd6ef17225f00c4b7ba98b..03298fbbaf05998c695580e23ef3299208f8363c 100644 (file)
  * 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)