On 7 March 2017 at 12:20, Reuben Thomas <r...@sc3d.org> wrote: > On 22 February 2017 at 13:55, Reuben Thomas <r...@sc3d.org> wrote: > >> >> I attach the latest state of play, which consists simply of updated >> versions of manywarnings.m4 and warnings.m4, in place of the new files I >> had before. (To test them I have simply placed them in a gnulib patch >> directory which is applied by bootstrap; I love how simple it is!) >> > > Ping! >
Ping!! Attached, the latest version of my patches (in fact they've not changed since last time, but there is an extra file I forgot to include before), and now I attach patches to existing files as such rather than as complete files. For reference, these versions do not address this request from Bruno: Please also fix the AC_REQUIRE([gl_UNKNOWN_WARNINGS_ARE_ERRORS]) invocation in > gl_WARN_ADD and gl_CXX_WARN_ADD. Since this macro expands to different code > after AC_LANG_PUSH([C++]) than after AC_LANG_PUSH([C]), it is wrong to > just AC_REQUIRE it. Needs to be a bit more intelligent. > Look at how _AC_LANG_ABBREV and _AC_LANG_PREFIX can be used. Maybe > libtool.m4, which also plays around with AC_LANG, gives you some hint > about this. I previously replied: I didn't fully understand this bit. I see that _AC_LANG_ABBREV/_AC_LANG_PREFIX > are used to inject the name of the language into the names of variables. I > see that gl_UNKNOWN_WARNINGS_ARE_ERRORS changes depending on the language > because gl_COMPILER_OPTION_IF changes. (By the way, can we now assume > autoconf 2.64 (of July 2009) or newer and hence quote gl_Warn, as per the > comment, there?) > Since gl_UNKNOWN_WARNINGS_ARE_ERRORS is therefore language-dependent, that > makes me think it needs to be called, not AC_REQUIREd, by > gl_{CXX_,}_WARN_ADD (because the language might change each time), but if > it were that simple, you'd've said so. So I'm not sure what else is needed… -- https://rrt.sc3d.org <http://rrt.sc3d.org>
--- gnulib/m4/manywarnings.m4 2017-08-03 18:10:49.139888596 +0100 +++ gl/m4/manywarnings.m4 2017-04-04 22:27:00.204131193 +0100 @@ -293,3 +274,248 @@ $1=$gl_manywarn_set ]) + +# gl_MANYWARN_ALL_GXX(VARIABLE) +# ----------------------------- +# Add all documented G++ warning parameters to variable VARIABLE. +# Note that you need to test them using gl_WARN_ADD if you want to +# make sure your gcc understands it. +AC_DEFUN([gl_MANYWARN_ALL_GXX], +[ + 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
--- gnulib/m4/warnings.m4 2017-02-23 15:26:15.536364509 +0000 +++ gl/m4/warnings.m4 2017-04-04 22:27:00.204131193 +0100 @@ -74,6 +74,20 @@ [AC_SUBST([WARN_CFLAGS])])dnl ]) -# Local Variables: -# mode: autoconf -# End: +# gl_CXX_WARN_ADD(OPTION, [VARIABLE = WARN_CFLAGS], +# [PROGRAM = AC_LANG_PROGRAM()]) +# --------------------------------------------- +# Adds parameter to WARN_CXXFLAGS if the compiler supports it when +# compiling PROGRAM. For example, gl_CXX_WARN_ADD([-Wparentheses]). +# +# If VARIABLE is a variable name, AC_SUBST it. +AC_DEFUN([gl_CXX_WARN_ADD], +[AC_REQUIRE([gl_UNKNOWN_WARNINGS_ARE_ERRORS]) +gl_COMPILER_OPTION_IF([$1], + [gl_AS_VAR_APPEND(m4_if([$2], [], [[WARN_CXXFLAGS]], [[$2]]), [" $1"])], + [], + [$3]) +m4_ifval([$2], + [AS_LITERAL_IF([$2], [AC_SUBST([$2])])], + [AC_SUBST([WARN_CXXFLAGS])])dnl +])