- [enableval=no])
-if test "${enableval}" = yes; then
- BISON_WARNING(-Werror)
- AC_SUBST([WERROR_CFLAGS], [$WARNING_CFLAGS])
- WARNING_CFLAGS=
- BISON_WARNING(-W)
- BISON_WARNING(-Wall)
- BISON_WARNING(-Wcast-align)
- BISON_WARNING(-Wcast-qual)
- BISON_WARNING(-Wformat)
- BISON_WARNING(-Wwrite-strings)
- AC_SUBST([WARNING_CXXFLAGS], [$WARNING_CFLAGS])
- # The following warnings are not suitable for C++.
- BISON_WARNING(-Wbad-function-cast)
- BISON_WARNING(-Wmissing-declarations)
- BISON_WARNING(-Wmissing-prototypes)
- BISON_WARNING(-Wnested-externs)
- BISON_WARNING(-Wshadow)
- BISON_WARNING(-Wstrict-prototypes)
- AC_DEFINE([lint], 1, [Define to 1 if the compiler is checking for lint.])
+ [enable_gcc_warnings=no])
+if test "$enable_gcc_warnings" = yes; then
+ warn_common='-Wall -Wextra -Wno-sign-compare -Wcast-align
+ -Wformat -Wpointer-arith -Wwrite-strings'
+ warn_c='-Wbad-function-cast -Wshadow -Wstrict-prototypes'
+ warn_cxx='-Wnoexcept'
+ # Warnings for the test suite only.
+ #
+ # -fno-color-diagnostics: Clang's use of colors in the error
+ # messages is confusing the tests looking at the compiler's output
+ # (e.g., synclines.at).
+ warn_tests='-Wundef -pedantic -Wsign-compare -fno-color-diagnostics'
+
+ AC_LANG_PUSH([C])
+ # Clang supports many of GCC's -W options, but only issues warnings
+ # on the ones it does not recognize. In that case, gl_WARN_ADD
+ # thinks the option is supported, and unknown options are then added
+ # to CFLAGS. But then, when -Werror is added in the test suite for
+ # instance, the warning about the unknown option turns into an
+ # error.
+ #
+ # This should be addressed by gnulib's gl_WARN_ADD, but in the
+ # meanwhile, turn warnings about unknown options into errors in
+ # CFLAGS, and restore CFLAGS after the tests.
+ save_CFLAGS=$CFLAGS
+ gl_WARN_ADD([-Werror=unknown-warning-option], [CFLAGS])
+ for i in $warn_common $warn_c;
+ do
+ gl_WARN_ADD([$i], [WARN_CFLAGS])
+ done
+ gl_WARN_ADD([-Werror], [WERROR_CFLAGS])
+
+ # Warnings for the test suite, and maybe for bison if GCC is modern
+ # enough.
+ gl_WARN_ADD([-Wmissing-declarations], [WARN_CFLAGS_TEST])
+ gl_WARN_ADD([-Wmissing-prototypes], [WARN_CFLAGS_TEST])
+ test $lv_cv_gcc_pragma_push_works = yes &&
+ AS_VAR_APPEND([WARN_CFLAGS], [" $WARN_CFLAGS_TEST"])
+
+ # Warnings for the test suite only.
+ for i in $warn_tests;
+ do
+ gl_WARN_ADD([$i], [WARN_CFLAGS_TEST])
+ done
+ CFLAGS=$save_CFLAGS
+ AC_LANG_POP([C])
+
+ AC_LANG_PUSH([C++])
+ save_CXXFLAGS=$CXXFLAGS
+ gl_WARN_ADD([-Werror=unknown-warning-option], [CXXFLAGS])
+ for i in $warn_common $warn_cxx;
+ do
+ gl_WARN_ADD([$i], [WARN_CXXFLAGS])
+ done
+ gl_WARN_ADD([-Wzero-as-null-pointer-constant], [WARN_CXXFLAGS],
+ [AC_LANG_PROGRAM([], [nullptr])])
+ gl_WARN_ADD([-Werror], [WERROR_CXXFLAGS])
+ # Warnings for the test suite only.
+ for i in $warn_tests;
+ do
+ gl_WARN_ADD([$i], [WARN_CXXFLAGS_TEST])
+ done
+ # Clang++ 3.2+ reject C code generated by Flex.
+ gl_WARN_ADD([-Wno-null-conversion], [FLEX_SCANNER_CXXFLAGS])
+ # So does G++ 4.8 in std=c++11 mode.
+ gl_WARN_ADD([-Wno-zero-as-null-pointer-constant], [FLEX_SCANNER_CXXFLAGS])
+ CXXFLAGS=$save_CXXFLAGS
+ AC_LANG_POP([C++])