From df8703523b002a44a9a5038bebb6397dad3bb42a Mon Sep 17 00:00:00 2001 From: Vas Crabb Date: Sat, 18 Sep 2021 02:02:58 +1000 Subject: util/strformat.h: Detect C++ standard > C++17 before doing weird stuff. --- scripts/genie.lua | 3 +++ src/lib/util/strformat.cpp | 1 - src/lib/util/strformat.h | 26 ++++++++++++++++---------- 3 files changed, 19 insertions(+), 11 deletions(-) diff --git a/scripts/genie.lua b/scripts/genie.lua index 173b0eee78e..4f443116ebb 100644 --- a/scripts/genie.lua +++ b/scripts/genie.lua @@ -497,6 +497,9 @@ configuration { "vs20*" } buildoptions { "/bigobj", } + buildoptions_cpp { + "/Zc:__cplusplus", + } flags { "ExtraWarnings", } diff --git a/src/lib/util/strformat.cpp b/src/lib/util/strformat.cpp index e173fb6aadf..cec14635e16 100644 --- a/src/lib/util/strformat.cpp +++ b/src/lib/util/strformat.cpp @@ -9,7 +9,6 @@ ***************************************************************************/ #include "strformat.h" -#include "vecstream.h" #include #include diff --git a/src/lib/util/strformat.h b/src/lib/util/strformat.h index 4714b9f5e71..e6d2ee0a0fe 100644 --- a/src/lib/util/strformat.h +++ b/src/lib/util/strformat.h @@ -597,10 +597,12 @@ private: str << int(std::make_signed_t(value)); else if constexpr (!std::is_signed_v || std::is_same_v) str << std::make_signed_t(value); - else if constexpr (std::is_invocable_v decltype(x << y) { return x << y; }), Stream &, U const &>) - str << value; - else +#if __cplusplus > 201703L + else if constexpr (!std::is_invocable_v decltype(x << y) { return x << y; }), Stream &, U const &>) str << std::make_signed_t(value); +#endif + else + str << value; } template @@ -610,10 +612,12 @@ private: str << unsigned(std::make_unsigned_t(value)); else if constexpr (!std::is_unsigned_v || std::is_same_v) str << std::make_unsigned_t(value); - else if constexpr (std::is_invocable_v decltype(x << y) { return x << y; }), Stream &, U const &>) - str << value; - else +#if __cplusplus > 201703L + else if constexpr (!std::is_invocable_v decltype(x << y) { return x << y; }), Stream &, U const &>) str << std::make_unsigned_t(value); +#endif + else + str << value; } public: @@ -819,14 +823,16 @@ public: str << reinterpret_cast(std::uintptr_t(value)); break; default: - if constexpr (std::is_invocable_v decltype(x << y) { return x << y; }), Stream &, U const &>) +#if __cplusplus > 201703L + if constexpr (!std::is_invocable_v decltype(x << y) { return x << y; }), Stream &, U const &>) { - str << value; + assert(false); // stream out operator not declared or declared deleted + str << '?'; } else +#endif { - assert(false); // stream out operator not declared or declared deleted - str << '?'; + str << value; } } } -- cgit v1.2.3