From: Reuben Thomas Date: Mon, 7 Aug 2017 15:32:18 +0000 (+0200) Subject: manywarnings: Add support for C++. X-Git-Tag: v1.0~6019 X-Git-Url: https://gitweb.git.savannah.gnu.org/gitweb/?a=commitdiff_plain;h=ddbba9b3b8b83dbcb93b131120dcfe857049270d;p=gnulib.git manywarnings: Add support for C++. * build-aux/g++-warning.spec: New file. * m4/manywarnings-c++.m4: New file. * modules/manywarnings (Files): Add it. --- diff --git a/ChangeLog b/ChangeLog index 37daf4cc8e..c88be654f5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2017-08-06 Reuben Thomas + + 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 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 index 0000000000..ae3e86676d --- /dev/null +++ b/build-aux/g++-warning.spec @@ -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= 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= 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= 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 index 0000000000..cb1548a5c3 --- /dev/null +++ b/m4/manywarnings-c++.m4 @@ -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++]) +]) diff --git a/modules/manywarnings b/modules/manywarnings index f557ef0f1a..ef220ff441 100644 --- a/modules/manywarnings +++ b/modules/manywarnings @@ -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