On 6 August 2017 at 23:50, Bruno Haible <br...@clisp.org> wrote:

>   - g++-warning.spec: Looks OK to me. I trust that your C++ experience is
>     fresher than mine (I learned C++ in 1997).
>

‚ÄčI simply went through the GCC manual and gcc-warning.spec and added in C++
warnings and removed those which were C only. I'm working with C++ in
Enchant at present, but I can't say I'm well up on modern C++ (or indeed
any other flavour).

I attach an updated patch against manywarnings.m4, and, for simplicity, the
same g++-warning.spec.

There's one issue left that I'm aware of: the recipe in the comments of the
C and C++ flavors of gl_MANYWARN_ALL_GCC for comparing the *.spec list of
warnings with one's own compiler no longer works, since it will grep all
the warnings for all languages defined in manywarnings.m4. I'm unsure how
best to fix this.

Currently in my configure.ac, I have:

  AC_LANG_PUSH([C++])
  gl_MANYWARN_ALL_GCC([cxx_warnings])

  dnl Enable all G++ warnings not in this list.
  gl_MANYWARN_COMPLEMENT([cxx_warnings], [$cxx_warnings], [$nw])
  for w in $cxx_warnings; do
    gl_WARN_ADD([$w])
  done
  AC_LANG_POP

which seems to work. However, it seems I should be able to call
gl_MANYWARN_ALL_GCC(C++) directly; but where then do I put the argument
giving the variable in which to put the warnings? I'm confused by the
apparent argument in the name of the macro!

I guess this explains why gl_MANYWARN_ALL_GCC({C,C++}) still contain
AC_LANG_PUSH/POP pairs, as they can in fact be called directly?

-- 
https://rrt.sc3d.org <http://rrt.sc3d.org>
--- gnulib/m4/manywarnings.m4   2017-08-07 13:10:45.183548018 +0100
+++ gl/m4/manywarnings.m4       2017-08-07 13:09:01.319551087 +0100
@@ -314,3 +314,244 @@
 
   AC_LANG_POP([C])
 ])
+
+# Specialization for _AC_LANG = C++. This macro can be AC_REQUIREd.
+AC_DEFUN([gl_MANYWARN_ALL_GCC(C++)],
+[
+  AC_LANG_PUSH([C++])
+
+  dnl First, check for some issues that only occur when combining multiple
+  dnl gcc warning categories.
+  AC_REQUIRE([AC_PROG_CXX])
+  if test -n "$GXX"; then
+
+    dnl Check if -W -Werror -Wno-missing-field-initializers is supported
+    dnl with the current $CXX $CXXFLAGS $CPPFLAGS.
+    AC_MSG_CHECKING([whether -Wno-missing-field-initializers is supported])
+    AC_CACHE_VAL([gl_cv_cxx_nomfi_supported], [
+      gl_save_CXXFLAGS="$CXXFLAGS"
+      CXXFLAGS="$CXXFLAGS -W -Werror -Wno-missing-field-initializers"
+      AC_COMPILE_IFELSE(
+        [AC_LANG_PROGRAM([[]], [[]])],
+        [gl_cv_cxx_nomfi_supported=yes],
+        [gl_cv_cxx_nomfi_supported=no])
+      CXXFLAGS="$gl_save_CXXFLAGS"])
+    AC_MSG_RESULT([$gl_cv_cxx_nomfi_supported])
+
+    if test "$gl_cv_cxx_nomfi_supported" = yes; then
+      dnl Now check whether -Wno-missing-field-initializers is needed
+      dnl for the { 0, } construct.
+      AC_MSG_CHECKING([whether -Wno-missing-field-initializers is needed])
+      AC_CACHE_VAL([gl_cv_cxx_nomfi_needed], [
+        gl_save_CXXFLAGS="$CXXFLAGS"
+        CXXFLAGS="$CXXFLAGS -W -Werror"
+        AC_COMPILE_IFELSE(
+          [AC_LANG_PROGRAM(
+             [[int f (void)
+               {
+                 typedef struct { int a; int b; } s_t;
+                 s_t s1 = { 0, };
+                 return s1.b;
+               }
+             ]],
+             [[]])],
+          [gl_cv_cxx_nomfi_needed=no],
+          [gl_cv_cxx_nomfi_needed=yes])
+        CXXFLAGS="$gl_save_CXXFLAGS"
+      ])
+      AC_MSG_RESULT([$gl_cv_cxx_nomfi_needed])
+    fi
+
+    dnl Next, check if -Werror -Wuninitialized is useful with the
+    dnl user's choice of $CXXFLAGS; some versions of gcc warn that it
+    dnl has no effect if -O is not also used
+    AC_MSG_CHECKING([whether -Wuninitialized is supported])
+    AC_CACHE_VAL([gl_cv_cxx_uninitialized_supported], [
+      gl_save_CXXFLAGS="$CXXFLAGS"
+      CXXFLAGS="$CXXFLAGS -Werror -Wuninitialized"
+      AC_COMPILE_IFELSE(
+        [AC_LANG_PROGRAM([[]], [[]])],
+        [gl_cv_cxx_uninitialized_supported=yes],
+        [gl_cv_cxx_uninitialized_supported=no])
+      CXXFLAGS="$gl_save_CXXFLAGS"])
+    AC_MSG_RESULT([$gl_cv_cxx_uninitialized_supported])
+
+  fi
+
+  # List all gcc warning categories.
+  # To compare this list to your installed GCC's, run this Bash command:
+  #
+  # comm -3 \
+  #  <(sed -n 's/^  *\(-[^ ]*\) .*/\1/p' manywarnings.m4 | sort) \
+  #  <(gcc --help=warnings | sed -n 's/^  \(-[^ ]*\) .*/\1/p' | sort |
+  #      grep -v -x -f <(
+  #         awk '/^[^#]/ {print $1}' ../build-aux/g++-warning.spec))
+
+  gl_manywarn_set=
+  for gl_manywarn_item in \
+    -W \
+    -Wabi \
+    -Wabi-tag \
+    -Waddress \
+    -Waggressive-loop-optimizations \
+    -Wall \
+    -Wattributes \
+    -Wbool-compare \
+    -Wbuiltin-macro-redefined \
+    -Wcast-align \
+    -Wchar-subscripts \
+    -Wchkp \
+    -Wclobbered \
+    -Wcomment \
+    -Wcomments \
+    -Wconditionally-supported \
+    -Wconversion-null \
+    -Wcoverage-mismatch \
+    -Wcpp \
+    -Wctor-dtor-privacy \
+    -Wdate-time \
+    -Wdelete-incomplete \
+    -Wdelete-non-virtual-dtor \
+    -Wdeprecated \
+    -Wdeprecated-declarations \
+    -Wdisabled-optimization \
+    -Wdiv-by-zero \
+    -Wdouble-promotion \
+    -Weffc++ \
+    -Wempty-body \
+    -Wendif-labels \
+    -Wenum-compare \
+    -Wextra \
+    -Wformat-contains-nul \
+    -Wformat-extra-args \
+    -Wformat-nonliteral \
+    -Wformat-security \
+    -Wformat-signedness \
+    -Wformat-y2k \
+    -Wformat-zero-length \
+    -Wfree-nonheap-object \
+    -Wignored-qualifiers \
+    -Winherited-variadic-ctor \
+    -Winit-self \
+    -Winline \
+    -Wint-to-pointer-cast \
+    -Winvalid-memory-model \
+    -Winvalid-offsetof \
+    -Winvalid-pch \
+    -Wliteral-suffix \
+    -Wlogical-not-parentheses \
+    -Wlogical-op \
+    -Wmain \
+    -Wmaybe-uninitialized \
+    -Wmemset-transposed-args \
+    -Wmissing-braces \
+    -Wmissing-declarations \
+    -Wmissing-field-initializers \
+    -Wmissing-include-dirs \
+    -Wmultichar \
+    -Wnarrowing \
+    -Wnoexcept \
+    -Wnon-template-friend \
+    -Wnon-virtual-dtor \
+    -Wnonnull \
+    -Wodr \
+    -Wold-style-cast \
+    -Wopenmp-simd \
+    -Woverflow \
+    -Woverlength-strings \
+    -Woverloaded-virtual \
+    -Wpacked \
+    -Wpacked-bitfield-compat \
+    -Wparentheses \
+    -Wpmf-conversions \
+    -Wpointer-arith \
+    -Wpragmas \
+    -Wreorder \
+    -Wreturn-local-addr \
+    -Wreturn-type \
+    -Wsequence-point \
+    -Wshadow \
+    -Wshift-count-negative \
+    -Wshift-count-overflow \
+    -Wsign-promo \
+    -Wsized-deallocation \
+    -Wsizeof-array-argument \
+    -Wsizeof-pointer-memaccess \
+    -Wstack-protector \
+    -Wstrict-aliasing \
+    -Wstrict-null-sentinel \
+    -Wstrict-overflow \
+    -Wsuggest-attribute=const \
+    -Wsuggest-attribute=format \
+    -Wsuggest-attribute=noreturn \
+    -Wsuggest-attribute=pure \
+    -Wsuggest-final-methods \
+    -Wsuggest-final-types \
+    -Wsuggest-override \
+    -Wswitch \
+    -Wswitch-bool \
+    -Wswitch-default \
+    -Wsync-nand \
+    -Wsystem-headers \
+    -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 \
+    -Wuseless-cast \
+    -Wvarargs \
+    -Wvariadic-macros \
+    -Wvector-operation-performance \
+    -Wvirtual-move-assign \
+    -Wvla \
+    -Wvolatile-register-var \
+    -Wwrite-strings \
+    -Wzero-as-null-pointer-constant \
+    \
+    ; do
+    gl_manywarn_set="$gl_manywarn_set $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.
+  gl_manywarn_set="$gl_manywarn_set -Warray-bounds=2"
+  gl_manywarn_set="$gl_manywarn_set -Wnormalized=nfc"
+  gl_manywarn_set="$gl_manywarn_set -Wshift-overflow=2"
+  gl_manywarn_set="$gl_manywarn_set -Wunused-const-variable=2"
+
+  # These are needed for older GCC versions.
+  if test -n "$GXX"; then
+    case `($CXX --version) 2>/dev/null` in
+      'g++ (GCC) '[[0-3]].* | \
+      'g++ (GCC) '4.[[0-7]].*)
+        gl_manywarn_set="$gl_manywarn_set -fdiagnostics-show-option"
+        gl_manywarn_set="$gl_manywarn_set -funit-at-a-time"
+          ;;
+    esac
+  fi
+
+  # Disable specific options as needed.
+  if test "$gl_cv_cxx_nomfi_needed" = yes; then
+    gl_manywarn_set="$gl_manywarn_set -Wno-missing-field-initializers"
+  fi
+
+  if test "$gl_cv_cxx_uninitialized_supported" = no; then
+    gl_manywarn_set="$gl_manywarn_set -Wno-uninitialized"
+  fi
+
+  $1=$gl_manywarn_set
+
+  AC_LANG_POP([C++])
+])
# options to filter out, and why
--all-warnings				alias for -Wall
--extra-warnings			alias for -Wextra
-frequire-return-statement		go
-Waggregate-return			obsolescent
-Waliasing				fortran
-Walign-commons				fortran
-Wampersand				fortran
-Warray-bounds				covered by -Warray-bounds=
-Warray-bounds=				handled specially by gl_MANYWARN_ALL_GCC
-Warray-temporaries			fortran
-Wassign-intercept			objc/objc++
-Wbad-function-cast			c
-Wc++0x-compat				c++ compatibility
-Wc++11-compat				c++ compatibility
-Wc++14-compat				c++ compatibility
-Wc90-c99-compat			c compatibility
-Wc99-c11-compat			c compatibility
-Wcast-qual				FIXME maybe? too much noise; encourages bad changes
-Wcast-result				d
-Wc-binding-type			fortran
-Wc++-compat				FIXME maybe? borderline.  some will want this
-Wcharacter-truncation			fortran
-Wcompare-reals				fortran
-Wconversion-extra			fortran
-Wconversion				FIXME maybe? too much noise; encourages bad changes
-Wdeclaration-after-statement		FIXME: do not want.  others may
-Wdesignated-init			c
-Wdiscarded-array-qualifiers		c
-Wdiscarded-qualifiers			c
-Werror-implicit-function-declaration	deprecated
-Wfloat-conversion			FIXME maybe? borderline.  some will want this
-Wfloat-equal				FIXME maybe? borderline.  some will want this
-Wformat				covered by -Wformat=2
-Wformat=				gcc --help=warnings artifact
-Wframe-larger-than=<number>		FIXME: choose something sane?
-Wfunction-elimination			fortran
-Wimplicit				c
-Wimplicit-function-declaration		c
-Wimplicit-int				c
-Wimplicit-interface			fortran
-Wimplicit-procedure			fortran
-Wincompatible-pointer-types		c
-Wint-conversion			c
-Winteger-division			fortran
-Wintrinsic-shadow			fortran
-Wintrinsics-std			fortran
-Wjump-misses-init			c
-Wlarger-than-				gcc --help=warnings artifact
-Wlarger-than=<number>			FIXME: choose something sane?
-Wline-truncation			fortran
-Wlong-long				obsolescent
-Wmissing-format-attribute		obsolescent
-Wmissing-noreturn			obsolescent
-Wmissing-parameter-type		c
-Wmissing-prototypes			c
-Wnested-externs			c
-Wnormalized				covered by -Wnormalized=
-Wnormalized=<none|id|nfc|nfkc>		handled specially by gl_MANYWARN_ALL_GCC
-Wold-style-declaration			c
-Wold-style-definition			c
-Woverride-init				c
-Wpadded				FIXME maybe?  warns about "stabil" member in /usr/include/bits/timex.h
-Wpedantic				FIXME: too strict?
-Wpointer-sign				c
-Wpointer-to-int-cast			c
-Wproperty-assign-default		objc++
-Wprotocol				objc++
-Wrealloc-lhs-all			fortran
-Wrealloc-lhs				fortran
-Wreal-q-constant			fortran
-Wredundant-decls			FIXME maybe? many _gl_cxxalias_dummy FPs
-Wselector				objc and objc++
-Wshadow-ivar				objc
-Wshift-overflow			covered by -Wshift-overflow=2
-Wshift-overflow=			gcc --help=warnings artifact
-Wsign-compare				FIXME maybe? borderline.  some will want this
-Wsign-conversion			FIXME maybe? borderline.  some will want this
-Wstack-usage=				FIXME: choose something sane?
-Wstrict-aliasing=			FIXME: choose something sane?
-Wstrict-overflow=			FIXME: choose something sane?
-Wstrict-prototypes			c
-Wstrict-selector-match			objc and objc++
-Wsurprising				fortran
-Wswitch-enum				FIXME maybe? borderline.  some will want this
-Wsynth					deprecated
-Wtabs					fortran
-Wtarget-lifetime			fortran
-Wtraditional-conversion		obsolescent
-Wtraditional				obsolescent
-Wundeclared-selector			objc and objc++
-Wundef					FIXME maybe? too many false positives
-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-const-variable=		gcc --help=warnings artifact
-Wunused-dummy-argument			fortran
-Wuse-without-only			fortran
-Wzerotrip				fortran

Reply via email to