diff options
author | Andres Freund <andres@anarazel.de> | 2022-12-29 12:47:29 -0800 |
---|---|---|
committer | Andres Freund <andres@anarazel.de> | 2023-01-02 15:51:03 -0800 |
commit | f0e13802f196bc1044d52669ae5ef0b32e3a4db2 (patch) | |
tree | a5726b38bc45f63408e1e9219d222787a319f91d /src | |
parent | 039567eb57ee5a5ab1a2ad2352316b2d31e7150e (diff) | |
download | postgresql-f0e13802f196bc1044d52669ae5ef0b32e3a4db2.tar.gz postgresql-f0e13802f196bc1044d52669ae5ef0b32e3a4db2.zip |
perl: Hide warnings inside perl.h when using gcc compatible compiler
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 <andres@anarazel.de>
Reviewed-by: Tom Lane <tgl@sss.pgh.pa.us>
Discussion: Discussion: https://postgr.es/m/20221228182455.hfdwd22zztvkojy2@awork3.anarazel.de
Diffstat (limited to 'src')
-rw-r--r-- | src/include/c.h | 28 | ||||
-rw-r--r-- | src/pl/plperl/plperl.h | 9 |
2 files changed, 37 insertions, 0 deletions
diff --git a/src/include/c.h b/src/include/c.h index f8754d2ed71..bbc53f5caa8 100644 --- a/src/include/c.h +++ b/src/include/c.h @@ -290,6 +290,34 @@ #endif #endif +/* + * 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 diff --git a/src/pl/plperl/plperl.h b/src/pl/plperl/plperl.h index 8619ff91f53..48ad7a1257a 100644 --- a/src/pl/plperl/plperl.h +++ b/src/pl/plperl/plperl.h @@ -70,6 +70,15 @@ #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 |