From 028bffa0830a8c0aca1e8b1c57ee25812cd61a56 Mon Sep 17 00:00:00 2001 From: Edoardo Lolletti Date: Sun, 19 May 2024 20:21:55 +0200 Subject: [PATCH] Update checks for dynamic_cast usage when compiled with no rtti (#3963) * Rename FMT_USE_TYPEID to FMT_HAS_RTTI and use it as check to enable dynamic_cast usage * FMT_HAS_RTTI->FMT_USE_RTTI --- include/fmt/base.h | 11 +++++++++++ include/fmt/ostream.h | 4 ++-- include/fmt/std.h | 15 ++------------- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/include/fmt/base.h b/include/fmt/base.h index f6bbde7eed0c..c840289572da 100644 --- a/include/fmt/base.h +++ b/include/fmt/base.h @@ -279,6 +279,17 @@ import std; # define FMT_UNICODE 1 #endif +// Check if rtti is available. +#ifndef FMT_USE_RTTI +// __RTTI is for EDG compilers. _CPPRTTI is for MSVC. +# if defined(__GXX_RTTI) || FMT_HAS_FEATURE(cxx_rtti) || defined(_CPPRTTI) || \ + defined(__INTEL_RTTI__) || defined(__RTTI) +# define FMT_USE_RTTI 1 +# else +# define FMT_USE_RTTI 0 +# endif +#endif + #define FMT_FWD(...) static_cast(__VA_ARGS__) // Enable minimal optimizations for more compact code in debug mode. diff --git a/include/fmt/ostream.h b/include/fmt/ostream.h index 1547184d36fd..79c69b1d568e 100644 --- a/include/fmt/ostream.h +++ b/include/fmt/ostream.h @@ -44,12 +44,12 @@ auto get_file(std::filebuf&) -> FILE*; inline auto write_ostream_unicode(std::ostream& os, fmt::string_view data) -> bool { FILE* f = nullptr; -#if FMT_MSC_VERSION +#if FMT_MSC_VERSION && FMT_USE_RTTI if (auto* buf = dynamic_cast(os.rdbuf())) f = get_file(*buf); else return false; -#elif defined(_WIN32) && defined(__GLIBCXX__) +#elif defined(_WIN32) && defined(__GLIBCXX__) && FMT_USE_RTTI auto* rdbuf = os.rdbuf(); if (auto* sfbuf = dynamic_cast<__gnu_cxx::stdio_sync_filebuf*>(rdbuf)) f = sfbuf->file(); diff --git a/include/fmt/std.h b/include/fmt/std.h index 5a5026f9aaa5..821d9fbea1d5 100644 --- a/include/fmt/std.h +++ b/include/fmt/std.h @@ -62,17 +62,6 @@ # endif #endif -// Check if typeid is available. -#ifndef FMT_USE_TYPEID -// __RTTI is for EDG compilers. _CPPRTTI is for MSVC. -# if defined(__GXX_RTTI) || FMT_HAS_FEATURE(cxx_rtti) || defined(_CPPRTTI) || \ - defined(__INTEL_RTTI__) || defined(__RTTI) -# define FMT_USE_TYPEID 1 -# else -# define FMT_USE_TYPEID 0 -# endif -#endif - // For older Xcode versions, __cpp_lib_xxx flags are inaccurately defined. #ifndef FMT_CPP_LIB_FILESYSTEM # ifdef __cpp_lib_filesystem @@ -443,7 +432,7 @@ struct formatter< if (it == end || *it == '}') return it; if (*it == 't') { ++it; - with_typename_ = FMT_USE_TYPEID != 0; + with_typename_ = FMT_USE_RTTI != 0; } return it; } @@ -455,7 +444,7 @@ struct formatter< if (!with_typename_) return detail::write_bytes(out, string_view(ex.what())); -#if FMT_USE_TYPEID +#if FMT_USE_RTTI const std::type_info& ti = typeid(ex); # ifdef FMT_HAS_ABI_CXA_DEMANGLE int status = 0;