From 33b47f7309653329fdd160867acd1830d9959ab2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Ho=C5=99e=C5=88ovsk=C3=BD?= Date: Tue, 25 Feb 2020 10:40:41 +0100 Subject: [PATCH] Fix warnings from stringifying functions The only way to stream those is to use the `bool` overload of `op<<`. However, to convert a function to bool, GCC creates AST equivalent of `A? true : false`. Then, because `A` is a function, it warns that it will never be `false`. :facepalm: As a bonus, newer GCC versions issue _two_ different warnings about this, but older GCC versions do not know both of them, so we also have to suppress warning about unknown warning suppression. --- src/catch2/catch_stream.h | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/catch2/catch_stream.h b/src/catch2/catch_stream.h index 999849c9..261a80e1 100644 --- a/src/catch2/catch_stream.h +++ b/src/catch2/catch_stream.h @@ -39,11 +39,27 @@ namespace Catch { auto str() const -> std::string; +#if defined(__GNUC__) && !defined(__clang__) +#pragma GCC diagnostic push +// Old versions of GCC do not understand -Wnonnull-compare +#pragma GCC diagnostic ignored "-Wpragmas" +// Streaming a function pointer triggers Waddress and Wnonnull-compare +// on GCC, because it implicitly converts it to bool and then decides +// that the check it uses (a? true : false) is tautological and cannot +// be null... +#pragma GCC diagnostic ignored "-Waddress" +#pragma GCC diagnostic ignored "-Wnonnull-compare" +#endif + template auto operator << ( T const& value ) -> ReusableStringStream& { *m_oss << value; return *this; } + +#if defined(__GNUC__) && !defined(__clang__) +#pragma GCC diagnostic pop +#endif auto get() -> std::ostream& { return *m_oss; } }; }