With GCC 10.1 all comparisons that default to the <=> C++20 comparison operator emit a spurious zero-as-null-pointer-constant warning, which is an error in our configuration. This is due to an implementation choice in the libstdc++ library, so it also causes warning from clang++ 10.0 when using the same libstdc++ library. A fix for GCC PR95242 was committed in g++ (not in libstdc++), so while g++ 10.2 might be fixed, clang++ will need a similar fix. I've seen those failures on Arch linux with gcc 10.1.0-2 and clang 10.0.0-3. On Debian sid, g++ 10.1.0-4 seems to already include the fix. * m4/gccwarn.m4: Include a string comparison in the test code so that -Wzero-as-null-pointer-constant is not enabled if it would produce warnings on such statements.
71 lines
2.4 KiB
Text
71 lines
2.4 KiB
Text
dnl Check if the compiler supports useful warning options. There's a few that
|
|
dnl we don't use, simply because they're too noisy:
|
|
dnl
|
|
dnl -ansi (prevents declaration of functions like strdup, and because
|
|
dnl it makes warning in system headers).
|
|
dnl -Wconversion (useful in older versions of gcc, but not in gcc 2.7.x)
|
|
dnl -Wtraditional (combines too many unrelated messages, only a few useful)
|
|
dnl -Wredundant-decls (system headers make this too noisy)
|
|
dnl -pedantic
|
|
dnl -Wunreachable-code (broken, see GCC PR/7827)
|
|
dnl -Wredundant-decls (too many warnings in GLIBC's header with old GCC)
|
|
dnl -Wstrict-prototypes (not valid in C++, gcc-3.4 complains)
|
|
dnl
|
|
dnl A few other options have been left out because they are annoying in C++.
|
|
|
|
|
|
AC_DEFUN([CF_GXX_WARNINGS],
|
|
[if test "x$GXX" = xyes; then
|
|
AC_CACHE_CHECK([for g++ warning options], ac_cv_prog_gxx_warn_flags,
|
|
[
|
|
cat > conftest.$ac_ext <<EOF
|
|
#line __oline__ "configure"
|
|
#include <string>
|
|
int main(int argc, char *argv[[]])
|
|
{
|
|
// This string comparison is here to detect superfluous
|
|
// zero-as-null-pointer-constant errors introduced with GCC 10.1's
|
|
// libstdc++, https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95242
|
|
// This is fixed in g++ 10.2, but has the fix is in the compiler
|
|
// instead of the library, clang++ 10.0 also has trouble with it.
|
|
// If we hit a compiler with this issue, we simply do not use
|
|
// -Wzero-as-null-pointer-constant.
|
|
std::string a{"foo"}, b{"bar"};
|
|
if (b < a)
|
|
return 1;
|
|
return argv[[argc-1]] == nullptr;
|
|
}
|
|
EOF
|
|
cf_save_CXXFLAGS="$CXXFLAGS"
|
|
ac_cv_prog_gxx_warn_flags="-W -Wall"
|
|
for cf_opt in \
|
|
Werror \
|
|
Wint-to-void-pointer-cast \
|
|
Wzero-as-null-pointer-constant \
|
|
Wcast-align \
|
|
Wpointer-arith \
|
|
Wwrite-strings \
|
|
Wcast-qual \
|
|
Wdocumentation \
|
|
Wmissing-declarations \
|
|
Wnoexcept \
|
|
Woverloaded-virtual \
|
|
Wmisleading-indentation \
|
|
Wimplicit-fallthrough \
|
|
Wlogical-op \
|
|
Wduplicated-cond \
|
|
Wnull-dereference \
|
|
Wsuggest-override \
|
|
Wpedantic
|
|
do
|
|
CXXFLAGS="$cf_save_CXXFLAGS $ac_cv_prog_gxx_warn_flags -$cf_opt"
|
|
if AC_TRY_EVAL(ac_compile); then
|
|
ac_cv_prog_gxx_warn_flags="$ac_cv_prog_gxx_warn_flags -$cf_opt"
|
|
test "$cf_opt" = Wcast-qual && ac_cv_prog_gxx_warn_flags="$ac_cv_prog_gxx_warn_flags -DXTSTRINGDEFINES"
|
|
fi
|
|
done
|
|
rm -f conftest*
|
|
CXXFLAGS="$cf_save_CXXFLAGS"])
|
|
fi
|
|
AC_SUBST([WARNING_CXXFLAGS], ["${ac_cv_prog_gxx_warn_flags}"])
|
|
])
|