Skip to content

Commit

Permalink
perl: Hide warnings inside perl.h when using gcc compatible compiler
Browse files Browse the repository at this point in the history
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
  • Loading branch information
anarazel committed Dec 29, 2022
1 parent 2039422 commit 388e801
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 0 deletions.
28 changes: 28 additions & 0 deletions src/include/c.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
9 changes: 9 additions & 0 deletions src/pl/plperl/plperl.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit 388e801

Please sign in to comment.