summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog7
-rw-r--r--build-aux/g++-warning.spec100
-rw-r--r--m4/manywarnings-c++.m4247
-rw-r--r--modules/manywarnings1
4 files changed, 355 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index 37daf4cc8e..c88be654f5 100644
--- 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
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=<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
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