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
+])

Reply via email to