On 6 August 2017 at 23:50, Bruno Haible <[email protected]> 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