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
This commit is contained in:
Andres Freund 2022-12-29 12:47:29 -08:00
parent 203942243c
commit 388e80132c
2 changed files with 37 additions and 0 deletions

View 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

View File

@ -74,6 +74,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