perl: Hide warnings inside perl.h when using gcc compatible compiler
authorAndres Freund <[email protected]>
Thu, 29 Dec 2022 20:47:29 +0000 (12:47 -0800)
committerAndres Freund <[email protected]>
Thu, 29 Dec 2022 20:47:29 +0000 (12:47 -0800)
New versions of perl trigger warnings within perl.h with our compiler
flags. At least -Wdeclaration-after-statement, -Wshadow=compatible-local are
known to be problematic.

To avoid these warnings, conditionally use #pragma GCC system_header before
including plperl.h.

Alternatively, we could add the include paths for problematic headers with
-isystem, but that is a larger hammer and is harder to search for.

A more granular alternative would be to use #pragma GCC diagnostic
push/ignored/pop, but gcc warns about unknown warnings being ignored, so every
to-be-ignored-temporarily compiler warning would require its own pg_config.h
symbol and #ifdef.

As the warnings are voluminous, it makes sense to backpatch this change. But
don't do so yet, we first want gather buildfarm coverage - it's e.g. possible
that some compiler claiming to be gcc compatible has issues with the pragma.

Author: Andres Freund <[email protected]>
Reviewed-by: Tom Lane <[email protected]>
Discussion: Discussion: https://postgr.es/m/20221228182455[email protected]

src/include/c.h
src/pl/plperl/plperl.h

index 7567ef7888b7561687d8c2199b7476153d9f40ed..9e1583e0d1034cde2d51bc006628b2f9d5f93e4e 100644 (file)
@@ -381,6 +381,34 @@ typedef void (*pg_funcptr_t) (void);
  */
 #define FLEXIBLE_ARRAY_MEMBER  /* empty */
 
+/*
+ * Does the compiler support #pragma GCC system_header? We optionally use it
+ * to avoid warnings that we can't fix (e.g. in the perl headers).
+ * See https://gcc.gnu.org/onlinedocs/cpp/System-Headers.html
+ *
+ * Headers for which we do not want to show compiler warnings can,
+ * conditionally, use #pragma GCC system_header to avoid warnings. Obviously
+ * this should only be used for external headers over which we do not have
+ * control.
+ *
+ * Support for the pragma is tested here, instead of during configure, as gcc
+ * also warns about the pragma being used in a .c file. It's surprisingly hard
+ * to get autoconf to use .h as the file-ending. Looks like gcc has
+ * implemented the pragma since the 2000, so this test should suffice.
+ *
+ *
+ * Alternatively, we could add the include paths for problematic headers with
+ * -isystem, but that is a larger hammer and is harder to search for.
+ *
+ * A more granular alternative would be to use #pragma GCC diagnostic
+ * push/ignored/pop, but gcc warns about unknown warnings being ignored, so
+ * every to-be-ignored-temporarily compiler warning would require its own
+ * pg_config.h symbol and #ifdef.
+ */
+#ifdef __GNUC__
+#define HAVE_PRAGMA_GCC_SYSTEM_HEADER  1
+#endif
+
 
 /* ----------------------------------------------------------------
  *                             Section 2:      bool, true, false
index 5243f308bd5c909cf1387886dc4a908ce8c7b16c..07e680bd790d26e9e9c5109b8ebda0fce7ccfab7 100644 (file)
 #define HAS_BOOL 1
 #endif
 
+/*
+ * Newer versions of the perl headers trigger a lot of warnings with our
+ * compiler flags (at least -Wdeclaration-after-statement,
+ * -Wshadow=compatible-local are known to be problematic). The system_header
+ * pragma hides warnings from within the rest of this file, if supported.
+ */
+#ifdef HAVE_PRAGMA_GCC_SYSTEM_HEADER
+#pragma GCC system_header
+#endif
 
 /*
  * Get the basic Perl API.  We use PERL_NO_GET_CONTEXT mode so that our code