On 5/23/20 9:08 AM, Paul Eggert wrote:

> So I am thinking of killing two
> stones by doing the following.
> 
> 1. Test for -fanalyzer, -Wall, -Wextra.
> 
> 2. Test for flags not automatically enabled by -fanalyzer, -Wall, -Wextra but
> flags that we want anyway.
> 
> 3. Test for flags automatically enabled by -fanalyzer, -Wall, -Wextra that are
> also flags that we don't want.

I did that in Gnulib by installing the attached patch. This could greatly
increase compile times due to the -fanalyzer option, so let's keep an eye out
for that.

On 5/23/20 9:22 AM, Tim Rühsen wrote:

> This has been done for Wget2
> https://gitlab.com/gnuwget/wget2/-/blob/master/m4/wget_manywarnings.m4
>
> Example usage at L123+:
> https://gitlab.com/gnuwget/wget2/-/blob/master/configure.ac
>
> To make it usable for other projects, it needs some merging with the
> manywarnings.m4 from gnulib, IMO. I would support any volunteer as good
> as i can.

Thanks. I think this different approach should be a win. I wanted to get the old
approach working with GCC 10.1 first though (and did that via the attached
patch) before trying out this new method, so that we can verify that switching
from old to new methods improves 'configure' performance without changing the
set of flags given to GCC. Perhaps we can wait for a bit for a shakeout period
for -fanalyzer etc., and then look into switching methods.
>From 3831e2e9f355c557b0c0ed9712548b62feaf694f Mon Sep 17 00:00:00 2001
From: Paul Eggert <egg...@cs.ucla.edu>
Date: Wed, 1 Jul 2020 17:00:51 -0700
Subject: [PATCH] manywarnings: improve port to GCC 10.1

* build-aux/gcc-warning.spec: Also list warnings that are default
or are enabled by already-given flags.  This lets us speed up
checking for attributes, and makes the generated compilation
commands shorter.  Add -Wanalyzer-too-complex (too much noise).
* m4/manywarnings.m4 (gl_MANYWARN_COMPLEMENT)
(gl_MANYWARN_ALL_GCC): Use gl_AS_VAR_APPEND to append
to shell variables that may have long values.
(gl_MANYWARN_ALL_GCC): Omit flags that are default or are
consequences of other flags, to speed up checking and
shorten commands.
---
 ChangeLog                  |  12 +++
 build-aux/gcc-warning.spec | 144 ++++++++++++++++++++++++--
 m4/manywarnings.m4         | 206 ++++++-------------------------------
 3 files changed, 181 insertions(+), 181 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index edb63b348..6115ab946 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,17 @@
 2020-07-01  Paul Eggert  <egg...@cs.ucla.edu>
 
+	manywarnings: improve port to GCC 10.1
+	* build-aux/gcc-warning.spec: Also list warnings that are default
+	or are enabled by already-given flags.  This lets us speed up
+	checking for attributes, and makes the generated compilation
+	commands shorter.  Add -Wanalyzer-too-complex (too much noise).
+	* m4/manywarnings.m4 (gl_MANYWARN_COMPLEMENT)
+	(gl_MANYWARN_ALL_GCC): Use gl_AS_VAR_APPEND to append
+	to shell variables that may have long values.
+	(gl_MANYWARN_ALL_GCC): Omit flags that are default or are
+	consequences of other flags, to speed up checking and
+	shorten commands.
+
 	tests: pacify gcc -fanalyzer on zerosize_ptr
 	* tests/test-memcasecmp.c (main):
 	* tests/test-memchr.c (main):
diff --git a/build-aux/gcc-warning.spec b/build-aux/gcc-warning.spec
index 89a0bc734..6c0602be4 100644
--- a/build-aux/gcc-warning.spec
+++ b/build-aux/gcc-warning.spec
@@ -1,24 +1,51 @@
 # options to filter out, and why
 --all-warnings				alias for -Wall
 --extra-warnings			alias for -Wextra
+-W					alias for -Wextra
 -Wabi					this is now a no-op
 -Wabi-tag				c++
 -Wabi=					c++
+-Wabsolute-value			enabled by -Wextra
+-Waddress				enabled by -Wall
+-Waddress-of-packed-member		default
 -Waggregate-return			obsolescent
+-Waggressive-loop-optimizations		default
 -Waliasing				fortran
 -Walign-commons				fortran
 -Waligned-new=[none|global|all]		c++
--Walloc-size-larger-than=<bytes>	handled specially by gl_MANYWARN_ALL_GCC
+-Walloc-size-larger-than=<bytes>	defaults to PTRDIFF_MAX
 -Walloc-zero				Gnulib fixes this problem
 -Walloca				we like alloca in small doses
 -Walloca-larger-than=<number>		FIXME: choose something sane?
 -Wampersand				fortran
+-Wanalyzer-double-fclose		enabled by -fanalyzer
+-Wanalyzer-double-free			enabled by -fanalyzer
+-Wanalyzer-exposure-through-output-file	enabled by -fanalyzer
+-Wanalyzer-file-leak			enabled by -fanalyzer
+-Wanalyzer-free-of-non-heap		enabled by -fanalyzer
+-Wanalyzer-malloc-leak			enabled by -fanalyzer
+-Wanalyzer-null-argument		enabled by -fanalyzer
+-Wanalyzer-null-dereference		enabled by -fanalyzer
+-Wanalyzer-possible-null-argument	enabled by -fanalyzer
+-Wanalyzer-possible-null-dereference	enabled by -fanalyzer
+-Wanalyzer-stale-setjmp-buffer		implied by -fanalyzer
+-Wanalyzer-tainted-array-index		FIXME maybe? too much noise
+-Wanalyzer-too-complex			enabled by -fanalyzer
+-Wanalyzer-unsafe-call-within-signal-handler	enabled by -fanalyzer
+-Wanalyzer-use-after-free		enabled by -fanalyzer
+-Wanalyzer-use-of-pointer-in-stale-stack-frame	enabled by -fanalyzer
 -Warray-bounds				covered by -Warray-bounds=
 -Warray-bounds=<0,2>			handled specially by gl_MANYWARN_ALL_GCC
 -Warray-temporaries			fortran
 -Wassign-intercept			objc/objc++
 -Wattribute-alias			covered by -Wattribute-alias=2
 -Wattribute-alias=<0,2>			handled specially by gl_MANYWARN_ALL_GCC
+-Wattribute-warning			default
+-Wattributes				default
+-Wbool-compare				enabled by -Wall
+-Wbool-operation			enabled by -Wall
+-Wbuiltin-declaration-mismatch		default
+-Wbuiltin-macro-redefined		default
 -Wc++-compat				only useful for code meant to be compiled by a C++ compiler
 -Wc++0x-compat				c++
 -Wc++11-compat				c++
@@ -31,63 +58,120 @@
 -Wc11-c2x-compat			c compatibility
 -Wc90-c99-compat			c compatibility
 -Wc99-c11-compat			c compatibility
+-Wcannot-profile			default
+-Wcast-align				enabled by -Wcast-align=strict
+-Wcast-function-type			enabled by -Wextra
 -Wcast-qual				FIXME maybe? too much noise; encourages bad changes
 -Wcast-result				D
 -Wcatch-value				c++
 -Wcatch-value=<0,3>			c++
+-Wchar-subscripts			enabled by -Wall
 -Wcharacter-truncation			fortran
 -Wchkp					deprecated
 -Wclass-conversion			c++ and objc++
 -Wclass-memaccess			c++
+-Wclobbered				enabled by -Wextra
 -Wcomma-subscript			c++ and objc++
+-Wcomment				enabled by -Wall
+-Wcomments				alias for -Wcomment
 -Wcompare-reals				fortran
 -Wconditionally-supported		c++ and objc++
 -Wconversion				FIXME maybe? too much noise; encourages bad changes
 -Wconversion-extra			fortran
 -Wconversion-null			c++ and objc++
+-Wcoverage-mismatch			default
+-Wcpp					default
 -Wctor-dtor-privacy			c++
+-Wdangling-else				enabled by -Wparentheses
 -Wdeclaration-after-statement		FIXME: do not want.  others may
 -Wdelete-incomplete			c++ and objc++
 -Wdelete-non-virtual-dtor		c++
+-Wdeprecated				default
 -Wdeprecated-copy			c++ and objc++
 -Wdeprecated-copy-dtor			c++ and objc++
+-Wdeprecated-declarations		default
+-Wdesignated-init			default
+-Wdiscarded-array-qualifiers		default
+-Wdiscarded-qualifiers			default
 -Wdo-subscript				fortran
+-Wdiv-by-zero				default
+-Wduplicate-decl-specifier		enabled by -Wall
 -Weffc++				c++
+-Wempty-body				enabled by -Wextra
+-Wenum-compare				enabled by -Wall
+-Wenum-conversion			enabled by -Wextra
+-Wendif-labels				default
 -Werror-implicit-function-declaration	deprecated
+-Wexpansion-to-defined			enabled by -Wextra
 -Wextra-semi				c++
 -Wfloat-conversion			FIXME maybe? borderline.  some will want this
 -Wfloat-equal				FIXME maybe? borderline.  some will want this
 -Wformat				covered by -Wformat=2
+-Wformat-contains-nul			default
+-Wformat-diag				enabled by -Wformat=2
+-Wformat-extra-args			enabled by -Wformat=2
+-Wformat-nonliteral			enabled by -Wformat=2
 -Wformat-overflow<0,2>			gcc --help=warnings artifact
 -Wformat-overflow=<0,2>			handled specially by gl_MANYWARN_ALL_GCC
+-Wformat-security			enabled by -Wformat=2
 -Wformat-truncation			covered by -Wformat-truncation=2
 -Wformat-truncation=<0,2>		handled specially by gl_MANYWARN_ALL_GCC
+-Wformat-y2k				enabled by -Wformat=2
+-Wformat-zero-length			enabled by -Wformat=2
 -Wformat=<0,2>				gcc --help=warnings artifact
+-Wframe-address				enabled by -Wall
 -Wframe-larger-than=<byte-size>		FIXME: choose something sane?
+-Wfree-nonheap-object			default
 -Wfunction-elimination			fortran
+-Whsa					default
+-Wif-not-aligned			default
+-Wignored-attributes			default
+-Wignored-qualifiers			enabled by -Wextra
+-Wimplicit				enabled by -Wall
 -Wimplicit-fallthrough			covered by -Wimplicit-fallthrough=2
 -Wimplicit-fallthrough=<0,5>		handled specially by gl_MANYWARN_ALL_GCC
+-Wimplicit-function-declaration		enabled by -Wimplicit
+-Wimplicit-int				enabled by -Wimplicit
 -Wimplicit-interface			fortran
 -Wimplicit-procedure			fortran
 -Winaccessible-base			c++ and objc++
+-Wincompatible-pointer-types		default
 -Winherited-variadic-ctor		c++
 -Winit-list-lifetime			c++ and objc++
+-Wint-conversion			default
+-Wint-in-bool-context			enabled by -Wall
+-Wint-to-pointer-cast			default
 -Winteger-division			fortran
 -Wintrinsic-shadow			fortran
 -Wintrinsics-std			fortran
+-Winvalid-memory-model			default
 -Winvalid-offsetof			c++ and objc++
 -Wjump-misses-init			only useful for code meant to be compiled by a C++ compiler
 -Wlarger-than-				gcc --help=warnings artifact
 -Wlarger-than=<byte-size>		FIXME: choose something sane?
 -Wline-truncation			fortran
 -Wliteral-suffix			c++ and objc++
+-Wlogical-not-parentheses		enabled by -Wall
 -Wlong-long				obsolescent
 -Wlto-type-mismatch			c++ and objc++
+-Wmain					enabled by -Wall
+-Wmaybe-uninitialized			enabled by -Wall or -Wextra
+-Wmemset-elt-size			enabled by -Wall
+-Wmemset-transposed-args		enabled by -Wall
+-Wmisleading-indentation		enabled by -Wall
 -Wmismatched-tags			c++ and objc++
+-Wmissing-attributes			enabled by -Wall
+-Wmissing-braces			enabled by -Wall
+-Wmissing-field-initializers		enabled by -Wextra
 -Wmissing-format-attribute		obsolescent
 -Wmissing-noreturn			obsolescent
+-Wmissing-parameter-type		enabled by -Wextra
+-Wmissing-profile			default
+-Wmultichar				default
 -Wmultiple-inheritance			c++ and objc++
+-Wmultistatement-macros			enabled by -Wall
 -Wnamespaces				c++
+-Wnarrowing				enabled by -Wall
 -Wno-alloc-size-larger-than		see -Walloc-size-larger-than
 -Wno-alloca-larger-than			see -Walloca-larger-than
 -Wno-frame-larger-than			see -Wframe-larger-than
@@ -98,21 +182,35 @@
 -Wnoexcept-type				c++
 -Wnon-template-friend			c++
 -Wnon-virtual-dtor			c++
--Wnormalized				covered by -Wnormalized=
--Wnormalized=[none|id|nfc|nfkc]		handled specially by gl_MANYWARN_ALL_GCC
+-Wnonnull				enabled by -Wall or -Wformat
+-Wnonnull-compare			enabled by -Wall
+-Wnormalized				default
+-Wnormalized=[none|id|nfc|nfkc]		defaults to nfc
+-Wodr					default
 -Wold-style-cast			c++ and objc++
+-Wold-style-declaration			enabled by -Wextra
+-Woverflow				default
 -Woverloaded-virtual			c++
+-Woverride-init				enabled by -Wextra
 -Woverride-init-side-effects		c++ and objc++
 -Woverwrite-recursive			fortran
+-Wpacked-bitfield-compat		default
+-Wpacked-not-aligned			enabled by -Wall
 -Wpadded				FIXME maybe?  warns about "stabil" member in /usr/include/bits/timex.h
+-Wparentheses				enabled by -Wall
 -Wpedantic				FIXME: too strict?
 -Wpessimizing-move			c++ and objc++
 -Wplacement-new				c++
 -Wplacement-new=<0,2>			c++
 -Wpmf-conversions			c++ and objc++
+-Wpointer-compare			default
+-Wpointer-sign				enabled by -Wall
+-Wpointer-to-int-cast			default
+-Wpragmas				default
 -Wprio-ctor-dtor			c++
 -Wproperty-assign-default		objc++
 -Wprotocol				objc++
+-Wpsabi					default
 -Wreal-q-constant			fortran
 -Wrealloc-lhs				fortran
 -Wrealloc-lhs-all			fortran
@@ -121,53 +219,87 @@
 -Wredundant-tags			c++ and objc++
 -Wregister				c++ and objc++
 -Wreorder				c++ and objc++
+-Wrestrict				enabled by -Wall
+-Wreturn-local-addr			default
+-Wreturn-type				enabled by -Wall
+-Wscalar-storage-order			default
 -Wselector				objc and objc++
+-Wsequence-point			enabled by -Wall
 -Wshadow-compatible-local		covered by -Wshadow
 -Wshadow-ivar				objc
 -Wshadow-local				covered by -Wshadow
 -Wshadow=compatible-local		covered by -Wshadow
 -Wshadow=global				covered by -Wshadow
 -Wshadow=local				covered by -Wshadow
+-Wshift-count-negative			default
+-Wshift-count-overflow			default
+-Wshift-negative-value			enabled by -Wextra
 -Wshift-overflow			covered by -Wshift-overflow=2
 -Wshift-overflow=<0,2>			gcc --help=warnings artifact
 -Wsign-compare				FIXME maybe? borderline.  some will want this
 -Wsign-conversion			FIXME maybe? borderline.  some will want this
 -Wsign-promo				c++ and objc++
 -Wsized-deallocation			c++ and objc++
+-Wsizeof-array-argument			default
+-Wsizeof-pointer-div			enabled by -Wall
+-Wsizeof-pointer-memaccess		enabled by -Wall
 -Wstack-usage=<byte-size>		FIXME: choose something sane?
+-Wstrict-aliasing			enabled by -Wall
 -Wstrict-aliasing=<0,3>			FIXME: choose something sane?
 -Wstrict-null-sentinel			c++ and objc++
 -Wstrict-overflow=<0,5>			FIXME: choose something sane?
 -Wstrict-selector-match			objc and objc++
--Wstringop-overflow			covered by -Wstringop-overflow=
--Wstringop-overflow=<0,4>		handled specially by gl_MANYWARN_ALL_GCC
+-Wstring-compare			enabled by -Wextra
+-Wstringop-overflow			covered by -Wstringop-overflow=2
+-Wstringop-overflow=<0,4>		defaults to 2
+-Wstringop-truncation			default
 -Wsubobject-linkage			c++ and objc++
 -Wsuggest-override			c++ and objc++
 -Wsurprising				fortran
+-Wswitch				enabled by -Wall
+-Wswitch-bool				default
 -Wswitch-default			https://lists.gnu.org/r/bug-gnulib/2018-05/msg00179.html
 -Wswitch-enum				FIXME maybe? borderline.  some will want this
+-Wswitch-outside-range			default
+-Wswitch-unreachable			default
 -Wsynth					deprecated
 -Wtabs					fortran
 -Wtarget-lifetime			fortran
+-Wtautological-compare			enabled by -Wall
 -Wtemplates				c++ and objc++
 -Wterminate				c++ and objc++
 -Wtraditional				obsolescent
 -Wtraditional-conversion		obsolescent
+-Wtrigraphs				enabled by -Wall
+-Wtype-limits				enabled by -Wextra
 -Wundeclared-selector			objc and objc++
 -Wundef					FIXME maybe? too many false positives
 -Wundefined-do-loop			fortran
 -Wunderflow				fortran
 -Wunreachable-code			obsolescent no-op
 -Wunsuffixed-float-constants		triggers warning in gnulib's timespec.h
--Wunused-const-variable			covered by -Wunusec-const-variable=2
+-Wunused				enabled by -Wall
+-Wunused-but-set-parameter		enabled by -Wunused
+-Wunused-but-set-variable		enabled by -Wunused
+-Wunused-const-variable			covered by -Wunused-const-variable=2
 -Wunused-const-variable=<0,2>		gcc --help=warnings artifact
 -Wunused-dummy-argument			fortran
+-Wunused-function			enabled by -Wunused
+-Wunused-label				enabled by -Wunused
+-Wunused-local-typedefs			enabled by -Wunused
+-Wunused-parameter			enabled by -Wunused
+-Wunused-result				enabled by -Wunused
+-Wunused-value				enabled by -Wunused
+-Wunused-variable			enabled by -Wunused
 -Wuse-without-only			fortran
 -Wuseless-cast				c++ and objc++
+-Wvarargs				default
 -Wvirtual-inheritance			c++
 -Wvirtual-move-assign			c++
 -Wvla-larger-than=<number>		handled specially by gl_MANYWARN_ALL_GCC
 -Wvolatile				c++ and objc++
+-Wvolatile-register-var			enabled by -Wall
 -Wzero-as-null-pointer-constant		c++ and objc++
+-Wzero-length-bounds			enabled by -Wall
 -Wzerotrip				fortran
 -frequire-return-statement		go
diff --git a/m4/manywarnings.m4 b/m4/manywarnings.m4
index 719bafb29..d18da048d 100644
--- a/m4/manywarnings.m4
+++ b/m4/manywarnings.m4
@@ -1,4 +1,4 @@
-# manywarnings.m4 serial 19
+# manywarnings.m4 serial 20
 dnl Copyright (C) 2008-2020 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
@@ -21,7 +21,7 @@ AC_DEFUN([gl_MANYWARN_COMPLEMENT],
       *" $gl_warn_item "*)
         ;;
       *)
-        gl_warn_set="$gl_warn_set $gl_warn_item"
+        gl_AS_VAR_APPEND([gl_warn_set], [" $gl_warn_item"])
         ;;
     esac
   done
@@ -49,12 +49,12 @@ m4_defun([gl_MANYWARN_ALL_GCC(C)],
   AC_REQUIRE([AC_PROG_CC])
   if test -n "$GCC"; then
 
-    dnl Check if -W -Werror -Wno-missing-field-initializers is supported
+    dnl Check if -Wextra -Werror -Wno-missing-field-initializers is supported
     dnl with the current $CC $CFLAGS $CPPFLAGS.
     AC_CACHE_CHECK([whether -Wno-missing-field-initializers is supported],
       [gl_cv_cc_nomfi_supported],
       [gl_save_CFLAGS="$CFLAGS"
-       CFLAGS="$CFLAGS -W -Werror -Wno-missing-field-initializers"
+       CFLAGS="$CFLAGS -Wextra -Werror -Wno-missing-field-initializers"
        AC_COMPILE_IFELSE(
          [AC_LANG_PROGRAM([[]], [[]])],
          [gl_cv_cc_nomfi_supported=yes],
@@ -68,7 +68,7 @@ m4_defun([gl_MANYWARN_ALL_GCC(C)],
       AC_CACHE_CHECK([whether -Wno-missing-field-initializers is needed],
         [gl_cv_cc_nomfi_needed],
         [gl_save_CFLAGS="$CFLAGS"
-         CFLAGS="$CFLAGS -W -Werror"
+         CFLAGS="$CFLAGS -Wextra -Werror"
          AC_COMPILE_IFELSE(
            [AC_LANG_PROGRAM(
               [[int f (void)
@@ -105,153 +105,41 @@ m4_defun([gl_MANYWARN_ALL_GCC(C)],
   # To compare this list to your installed GCC's, run this Bash command:
   #
   # comm -3 \
-  #  <((sed -n 's/^  *\(-[^ 0-9][^ ]*\) .*/\1/p' manywarnings.m4; \
+  #  <((sed -n 's/^  *\(-[^ 0-9][^ ]*\).*/\1/p' manywarnings.m4; \
   #     awk '/^[^#]/ {print $1}' ../build-aux/gcc-warning.spec) | sort) \
   #  <(LC_ALL=C gcc --help=warnings | sed -n 's/^  \(-[^ ]*\) .*/\1/p' | sort)
 
-  gl_manywarn_set=
-  for gl_manywarn_item in -fno-common \
-    -W \
-    -Wabsolute-value \
-    -Waddress \
-    -Waddress-of-packed-member \
-    -Waggressive-loop-optimizations \
+  $1=
+  for gl_manywarn_item in -fanalyzer -fno-common \
     -Wall \
-    -Wanalyzer-double-fclose \
-    -Wanalyzer-double-free \
-    -Wanalyzer-exposure-through-output-file \
-    -Wanalyzer-file-leak \
-    -Wanalyzer-free-of-non-heap \
-    -Wanalyzer-malloc-leak \
-    -Wanalyzer-null-argument \
-    -Wanalyzer-null-dereference \
-    -Wanalyzer-possible-null-argument \
-    -Wanalyzer-possible-null-dereference \
-    -Wanalyzer-stale-setjmp-buffer \
-    -Wanalyzer-tainted-array-index \
-    -Wanalyzer-too-complex \
-    -Wanalyzer-unsafe-call-within-signal-handler \
-    -Wanalyzer-use-after-free \
-    -Wanalyzer-use-of-pointer-in-stale-stack-frame \
     -Warith-conversion \
-    -Wattribute-warning \
-    -Wattributes \
     -Wbad-function-cast \
-    -Wbool-compare \
-    -Wbool-operation \
-    -Wbuiltin-declaration-mismatch \
-    -Wbuiltin-macro-redefined \
-    -Wcannot-profile \
-    -Wcast-align \
     -Wcast-align=strict \
-    -Wcast-function-type \
-    -Wchar-subscripts \
-    -Wclobbered \
-    -Wcomment \
-    -Wcomments \
-    -Wcoverage-mismatch \
-    -Wcpp \
-    -Wdangling-else \
     -Wdate-time \
-    -Wdeprecated \
-    -Wdeprecated-declarations \
-    -Wdesignated-init \
     -Wdisabled-optimization \
-    -Wdiscarded-array-qualifiers \
-    -Wdiscarded-qualifiers \
-    -Wdiv-by-zero \
     -Wdouble-promotion \
     -Wduplicated-branches \
     -Wduplicated-cond \
-    -Wduplicate-decl-specifier \
-    -Wempty-body \
-    -Wendif-labels \
-    -Wenum-compare \
-    -Wenum-conversion \
-    -Wexpansion-to-defined \
     -Wextra \
-    -Wformat-contains-nul \
-    -Wformat-diag \
-    -Wformat-extra-args \
-    -Wformat-nonliteral \
-    -Wformat-security \
     -Wformat-signedness \
-    -Wformat-y2k \
-    -Wformat-zero-length \
-    -Wframe-address \
-    -Wfree-nonheap-object \
-    -Whsa \
-    -Wif-not-aligned \
-    -Wignored-attributes \
-    -Wignored-qualifiers \
-    -Wimplicit \
-    -Wimplicit-function-declaration \
-    -Wimplicit-int \
-    -Wincompatible-pointer-types \
     -Winit-self \
     -Winline \
-    -Wint-conversion \
-    -Wint-in-bool-context \
-    -Wint-to-pointer-cast \
-    -Winvalid-memory-model \
     -Winvalid-pch \
-    -Wlogical-not-parentheses \
     -Wlogical-op \
-    -Wmain \
-    -Wmaybe-uninitialized \
-    -Wmemset-elt-size \
-    -Wmemset-transposed-args \
-    -Wmisleading-indentation \
-    -Wmissing-attributes \
-    -Wmissing-braces \
     -Wmissing-declarations \
-    -Wmissing-field-initializers \
     -Wmissing-include-dirs \
-    -Wmissing-parameter-type \
-    -Wmissing-profile \
     -Wmissing-prototypes \
-    -Wmultichar \
-    -Wmultistatement-macros \
-    -Wnarrowing \
     -Wnested-externs \
-    -Wnonnull \
-    -Wnonnull-compare \
     -Wnull-dereference \
-    -Wodr \
-    -Wold-style-declaration \
     -Wold-style-definition \
     -Wopenmp-simd \
-    -Woverflow \
     -Woverlength-strings \
-    -Woverride-init \
     -Wpacked \
-    -Wpacked-bitfield-compat \
-    -Wpacked-not-aligned \
-    -Wparentheses \
     -Wpointer-arith \
-    -Wpointer-compare \
-    -Wpointer-sign \
-    -Wpointer-to-int-cast \
-    -Wpragmas \
-    -Wpsabi \
-    -Wrestrict \
-    -Wreturn-local-addr \
-    -Wreturn-type \
-    -Wscalar-storage-order \
-    -Wsequence-point \
     -Wshadow \
-    -Wshift-count-negative \
-    -Wshift-count-overflow \
-    -Wshift-negative-value \
-    -Wsizeof-array-argument \
-    -Wsizeof-pointer-div \
-    -Wsizeof-pointer-memaccess \
     -Wstack-protector \
-    -Wstrict-aliasing \
     -Wstrict-overflow \
     -Wstrict-prototypes \
-    -Wstring-compare \
-    -Wstringop-truncation \
     -Wsuggest-attribute=cold \
     -Wsuggest-attribute=const \
     -Wsuggest-attribute=format \
@@ -260,95 +148,63 @@ m4_defun([gl_MANYWARN_ALL_GCC(C)],
     -Wsuggest-attribute=pure \
     -Wsuggest-final-methods \
     -Wsuggest-final-types \
-    -Wswitch \
-    -Wswitch-bool \
-    -Wswitch-outside-range \
-    -Wswitch-unreachable \
     -Wsync-nand \
     -Wsystem-headers \
-    -Wtautological-compare \
     -Wtrampolines \
-    -Wtrigraphs \
-    -Wtype-limits \
     -Wuninitialized \
     -Wunknown-pragmas \
     -Wunsafe-loop-optimizations \
-    -Wunused \
-    -Wunused-but-set-parameter \
-    -Wunused-but-set-variable \
-    -Wunused-function \
-    -Wunused-label \
-    -Wunused-local-typedefs \
     -Wunused-macros \
-    -Wunused-parameter \
-    -Wunused-result \
-    -Wunused-value \
-    -Wunused-variable \
-    -Wvarargs \
     -Wvariadic-macros \
     -Wvector-operation-performance \
     -Wvla \
-    -Wvolatile-register-var \
     -Wwrite-strings \
-    -Wzero-length-bounds \
     \
     ; do
-    gl_manywarn_set="$gl_manywarn_set $gl_manywarn_item"
+    gl_AS_VAR_APPEND([$1], [" $gl_manywarn_item"])
   done
 
   # gcc --help=warnings outputs an unusual form for these options; list
   # them here so that the above 'comm' command doesn't report a false match.
-  # Would prefer "min (PTRDIFF_MAX, SIZE_MAX)", but it must be a literal.
-  # Also, AC_COMPUTE_INT requires it to fit in a long; it is 2**63 on
-  # the only platforms where it does not fit in a long, so make that
-  # a special case.
-  AC_MSG_CHECKING([max safe object size])
-  AC_COMPUTE_INT([gl_alloc_max],
-    [LONG_MAX < (PTRDIFF_MAX < (size_t) -1 ? PTRDIFF_MAX : (size_t) -1)
-     ? -1
-     : PTRDIFF_MAX < (size_t) -1 ? (long) PTRDIFF_MAX : (long) (size_t) -1],
-    [[#include <limits.h>
-      #include <stddef.h>
-      #include <stdint.h>
-    ]],
-    [gl_alloc_max=2147483647])
-  case $gl_alloc_max in
-    -1) gl_alloc_max=9223372036854775807;;
-  esac
-  AC_MSG_RESULT([$gl_alloc_max])
-  gl_manywarn_set="$gl_manywarn_set -Walloc-size-larger-than=$gl_alloc_max"
-  gl_manywarn_set="$gl_manywarn_set -Warray-bounds=2"
-  gl_manywarn_set="$gl_manywarn_set -Wattribute-alias=2"
-  gl_manywarn_set="$gl_manywarn_set -Wformat-overflow=2"
-  gl_manywarn_set="$gl_manywarn_set -Wformat-truncation=2"
-  gl_manywarn_set="$gl_manywarn_set -Wimplicit-fallthrough=5"
-  gl_manywarn_set="$gl_manywarn_set -Wnormalized=nfc"
-  gl_manywarn_set="$gl_manywarn_set -Wshift-overflow=2"
-  gl_manywarn_set="$gl_manywarn_set -Wstringop-overflow=2"
-  gl_manywarn_set="$gl_manywarn_set -Wunused-const-variable=2"
-  gl_manywarn_set="$gl_manywarn_set -Wvla-larger-than=4031"
+  gl_AS_VAR_APPEND([$1], [' -Warray-bounds=2'])
+  gl_AS_VAR_APPEND([$1], [' -Wattribute-alias=2'])
+  gl_AS_VAR_APPEND([$1], [' -Wformat-overflow=2'])
+  gl_AS_VAR_APPEND([$1], [' -Wformat=2'])
+  gl_AS_VAR_APPEND([$1], [' -Wformat-truncation=2'])
+  gl_AS_VAR_APPEND([$1], [' -Wimplicit-fallthrough=5'])
+  gl_AS_VAR_APPEND([$1], [' -Wshift-overflow=2'])
+  gl_AS_VAR_APPEND([$1], [' -Wunused-const-variable=2'])
+  gl_AS_VAR_APPEND([$1], [' -Wvla-larger-than=4031'])
 
   # These are needed for older GCC versions.
   if test -n "$GCC"; then
     case `($CC --version) 2>/dev/null` in
       'gcc (GCC) '[[0-3]].* | \
       'gcc (GCC) '4.[[0-7]].*)
-        gl_manywarn_set="$gl_manywarn_set -fdiagnostics-show-option"
-        gl_manywarn_set="$gl_manywarn_set -funit-at-a-time"
+        gl_AS_VAR_APPEND([$1], [' -fdiagnostics-show-option'])
+        gl_AS_VAR_APPEND([$1], [' -funit-at-a-time'])
           ;;
     esac
   fi
 
   # Disable specific options as needed.
   if test "$gl_cv_cc_nomfi_needed" = yes; then
-    gl_manywarn_set="$gl_manywarn_set -Wno-missing-field-initializers"
+    gl_AS_VAR_APPEND([$1], [' -Wno-missing-field-initializers'])
   fi
 
   if test "$gl_cv_cc_uninitialized_supported" = no; then
-    gl_manywarn_set="$gl_manywarn_set -Wno-uninitialized"
+    gl_AS_VAR_APPEND([$1], [' -Wno-uninitialized'])
   fi
 
-  $1=$gl_manywarn_set
+  # Some warnings have too many false alarms in GCC 10.1.
+  # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93695
+  gl_AS_VAR_APPEND([$1], [' -Wno-analyzer-double-free'])
+  # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94458
+  gl_AS_VAR_APPEND([$1], [' -Wno-analyzer-malloc-leak'])
+  # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94851
+  gl_AS_VAR_APPEND([$1], [' -Wno-analyzer-null-dereference'])
+  # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95758
+  gl_AS_VAR_APPEND([$1], [' -Wno-analyzer-use-after-free'])
 
   AC_LANG_POP([C])
 ])
-- 
2.17.1

Reply via email to