summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2016-09-10 17:54:23 -0400
committerTom Lane <tgl@sss.pgh.pa.us>2016-09-10 17:54:23 -0400
commit0db3c5552a16c0e73e0c24a36a3bacc77820bf02 (patch)
tree3e94c67418ef1c3435a5cdf8f253feef9b85a267
parentdfe7121dfbeec0eb13b09b04eaf9c6ca1d1f21be (diff)
Improve unreachability recognition in elog() macro.
Some experimentation with an older version of gcc showed that it is able to determine whether "if (elevel_ >= ERROR)" is compile-time constant if elevel_ is declared "const", but otherwise not so much. We had accounted for that in ereport() but were too miserly with braces to make it so in elog(). I don't know how many currently-interesting compilers have the same quirk, but in case it will save some code space, let's make sure that elog() is on the same footing as ereport() for this purpose. Back-patch to 9.3 where we introduced pg_unreachable() calls into elog/ereport.
-rw-r--r--src/include/utils/elog.h11
1 files changed, 6 insertions, 5 deletions
diff --git a/src/include/utils/elog.h b/src/include/utils/elog.h
index 832b984c4c9..4258b650cb6 100644
--- a/src/include/utils/elog.h
+++ b/src/include/utils/elog.h
@@ -250,12 +250,13 @@ extern int getinternalerrposition(void);
#else /* !HAVE__BUILTIN_CONSTANT_P */
#define elog(elevel, ...) \
do { \
- int elevel_; \
elog_start(__FILE__, __LINE__, PG_FUNCNAME_MACRO); \
- elevel_ = (elevel); \
- elog_finish(elevel_, __VA_ARGS__); \
- if (elevel_ >= ERROR) \
- pg_unreachable(); \
+ { \
+ const int elevel_ = (elevel); \
+ elog_finish(elevel_, __VA_ARGS__); \
+ if (elevel_ >= ERROR) \
+ pg_unreachable(); \
+ } \
} while(0)
#endif /* HAVE__BUILTIN_CONSTANT_P */
#else /* !HAVE__VA_ARGS */