summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Rowley2022-10-05 21:08:31 +0000
committerDavid Rowley2022-10-05 21:08:31 +0000
commit112f0225dbfe8af217294bfa0bd227f3302a1658 (patch)
tree4087e349808244d0520c8be35e8dfc2777e51fe8
parent23f3989d929e9301a29ee3a25ecf8040d8de20c2 (diff)
Add optional parameter to PG_TRY() macros
This optional parameter can be specified in cases where there are nested PG_TRY() statements within a function in order to stop the compiler from issuing warnings about shadowed local variables when compiling with -Wshadow. The optional parameter is used as a suffix on the variable names declared within the PG_TRY(), PG_CATCH(), PG_FINALLY() and PG_END_TRY() macros. The parameter, if specified, must be the same in each component macro of the given PG_TRY() block. This also adjusts the single case where we have nested PG_TRY() statements to add a parameter to the inner-most PG_TRY(). This reduces the number of compiler warnings when compiling with -Wshadow=compatible-local from 5 down to 1. Author: David Rowley Discussion: https://postgr.es/m/CAApHDvqWGMdB_pATeUqE=JCtNqNxObPOJ00jFEa2_sZ20j_Wvg@mail.gmail.com
-rw-r--r--src/backend/tcop/utility.c6
-rw-r--r--src/include/utils/elog.h44
2 files changed, 29 insertions, 21 deletions
diff --git a/src/backend/tcop/utility.c b/src/backend/tcop/utility.c
index aa00815787..247d0816ad 100644
--- a/src/backend/tcop/utility.c
+++ b/src/backend/tcop/utility.c
@@ -1678,16 +1678,16 @@ ProcessUtilitySlow(ParseState *pstate,
* command itself is queued, which is enough.
*/
EventTriggerInhibitCommandCollection();
- PG_TRY();
+ PG_TRY(2);
{
address = ExecRefreshMatView((RefreshMatViewStmt *) parsetree,
queryString, params, qc);
}
- PG_FINALLY();
+ PG_FINALLY(2);
{
EventTriggerUndoInhibitCommandCollection();
}
- PG_END_TRY();
+ PG_END_TRY(2);
break;
case T_CreateTrigStmt:
diff --git a/src/include/utils/elog.h b/src/include/utils/elog.h
index 4dd9658a3c..f107a818e8 100644
--- a/src/include/utils/elog.h
+++ b/src/include/utils/elog.h
@@ -310,39 +310,47 @@ extern PGDLLIMPORT ErrorContextCallback *error_context_stack;
* pedantry; we have seen bugs from compilers improperly optimizing code
* away when such a variable was not marked. Beware that gcc's -Wclobbered
* warnings are just about entirely useless for catching such oversights.
+ *
+ * Each of these macros accepts an optional argument which can be specified
+ * to apply a suffix to the variables declared within the macros. This suffix
+ * can be used to avoid the compiler emitting warnings about shadowed
+ * variables when compiling with -Wshadow in situations where nested PG_TRY()
+ * statements are required. The optional suffix may contain any character
+ * that's allowed in a variable name. The suffix, if specified, must be the
+ * same within each component macro of the given PG_TRY() statement.
*----------
*/
-#define PG_TRY() \
+#define PG_TRY(...) \
do { \
- sigjmp_buf *_save_exception_stack = PG_exception_stack; \
- ErrorContextCallback *_save_context_stack = error_context_stack; \
- sigjmp_buf _local_sigjmp_buf; \
- bool _do_rethrow = false; \
- if (sigsetjmp(_local_sigjmp_buf, 0) == 0) \
+ sigjmp_buf *_save_exception_stack##__VA_ARGS__ = PG_exception_stack; \
+ ErrorContextCallback *_save_context_stack##__VA_ARGS__ = error_context_stack; \
+ sigjmp_buf _local_sigjmp_buf##__VA_ARGS__; \
+ bool _do_rethrow##__VA_ARGS__ = false; \
+ if (sigsetjmp(_local_sigjmp_buf##__VA_ARGS__, 0) == 0) \
{ \
- PG_exception_stack = &_local_sigjmp_buf
+ PG_exception_stack = &_local_sigjmp_buf##__VA_ARGS__
-#define PG_CATCH() \
+#define PG_CATCH(...) \
} \
else \
{ \
- PG_exception_stack = _save_exception_stack; \
- error_context_stack = _save_context_stack
+ PG_exception_stack = _save_exception_stack##__VA_ARGS__; \
+ error_context_stack = _save_context_stack##__VA_ARGS__
-#define PG_FINALLY() \
+#define PG_FINALLY(...) \
} \
else \
- _do_rethrow = true; \
+ _do_rethrow##__VA_ARGS__ = true; \
{ \
- PG_exception_stack = _save_exception_stack; \
- error_context_stack = _save_context_stack
+ PG_exception_stack = _save_exception_stack##__VA_ARGS__; \
+ error_context_stack = _save_context_stack##__VA_ARGS__
-#define PG_END_TRY() \
+#define PG_END_TRY(...) \
} \
- if (_do_rethrow) \
+ if (_do_rethrow##__VA_ARGS__) \
PG_RE_THROW(); \
- PG_exception_stack = _save_exception_stack; \
- error_context_stack = _save_context_stack; \
+ PG_exception_stack = _save_exception_stack##__VA_ARGS__; \
+ error_context_stack = _save_context_stack##__VA_ARGS__; \
} while (0)
/*