On Wed, 5 Oct 2022 at 21:05, David Rowley <dgrowle...@gmail.com> wrote:
> 5 warnings remain.  4 of these are for PG_TRY() and co.

I've attached a draft patch for a method I was considering to fix the
warnings we're getting from the nested PG_TRY() statement in
utility.c.

The C preprocessor does not allow name overloading in macros, but of
course, it does allow variable argument marcos with ...  so I just
used that and added ##__VA_ARGS__ to each variable.  I think that
should work ok providing callers only supply 0 or 1 arguments to the
macro, and of course, make that parameter value the same for each set
of macros used in the PG_TRY() statement.

The good thing about the optional argument is that we don't need to
touch any existing users of PG_TRY().  The attached just modifies the
inner-most PG_TRY() in the only nested PG_TRY() we have in the tree in
utility.c.

The only warning remaining after applying the attached is the "now"
warning in pgbench.c:7509.  I'd considered changing this to "thenow"
which translates to "right now" in the part of Scotland that I'm from.
I also considered "nownow", which is used in South Africa [1].
Anyway, I'm not really being serious, but I didn't come up with
anything better than "now2". It's just I didn't like that as it sort
of implies there are multiple definitions of "now" and I struggle with
that...  maybe I'm just thinking too much in terms of Newtonian
Relativity...

David

[1] https://www.goodthingsguy.com/fun/now-now-just-now/
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..c79d6cfba3 100644
--- a/src/include/utils/elog.h
+++ b/src/include/utils/elog.h
@@ -310,39 +310,48 @@ 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 set of PG_TRY() / PG_CATCH() / PG_FINALLY() / PG_END_TRY()
+ * statements.
  *----------
  */
-#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)
 
 /*

Reply via email to