]> Savannah Git Hosting - gnulib.git/commitdiff
manywarnings: Add support for C++.
authorReuben Thomas <rrt@sc3d.org>
Mon, 7 Aug 2017 15:32:18 +0000 (17:32 +0200)
committerBruno Haible <bruno@clisp.org>
Mon, 7 Aug 2017 15:32:18 +0000 (17:32 +0200)
* build-aux/g++-warning.spec: New file.
* m4/manywarnings-c++.m4: New file.
* modules/manywarnings (Files): Add it.

ChangeLog
build-aux/g++-warning.spec [new file with mode: 0644]
m4/manywarnings-c++.m4 [new file with mode: 0644]
modules/manywarnings

index 37daf4cc8e0e12936447c157fb74c27ff4fe698b..c88be654f51b78ae8951816e36fc35acbca097d1 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2017-08-06  Reuben Thomas  <rrt@sc3d.org>
+
+       manywarnings: Add support for C++.
+       * build-aux/g++-warning.spec: New file.
+       * m4/manywarnings-c++.m4: New file.
+       * modules/manywarnings (Files): Add it.
+
 2017-08-06  Paul Eggert  <eggert@cs.ucla.edu>
 
        git-version-gen: another fix for tags with "-"
diff --git a/build-aux/g++-warning.spec b/build-aux/g++-warning.spec
new file mode 100644 (file)
index 0000000..ae3e866
--- /dev/null
@@ -0,0 +1,100 @@
+# 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
diff --git a/m4/manywarnings-c++.m4 b/m4/manywarnings-c++.m4
new file mode 100644 (file)
index 0000000..cb1548a
--- /dev/null
@@ -0,0 +1,247 @@
+# manywarnings-c++.m4 serial 1
+dnl Copyright (C) 2008-2017 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+# Specialization of gl_MANYWARN_ALL_GCC 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-c++.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++])
+])
index f557ef0f1a7ff5ea0aebfd47ee35da6a3ab254c9..ef220ff4415630c769952bd56dfeed0aea8d8f4a 100644 (file)
@@ -3,6 +3,7 @@ Helper M4 functions to help work out a set of warning parameters to use.
 
 Files:
 m4/manywarnings.m4
+m4/manywarnings-c++.m4
 
 Depends-on:
 warnings