On 7 March 2017 at 12:20, Reuben Thomas <[email protected]> wrote:
> On 22 February 2017 at 13:55, Reuben Thomas <[email protected]> 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
+])