diff --git a/include/fmt/base.h b/include/fmt/base.h index f6bbde7eed0c..c0ff660a38f0 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_HAS_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_HAS_RTTI 1 +# else +# define FMT_HAS_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..17958f56cf8f 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_HAS_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_HAS_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..c3fdb49396a0 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_HAS_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_HAS_RTTI const std::type_info& ti = typeid(ex); # ifdef FMT_HAS_ABI_CXA_DEMANGLE int status = 0;