diff --git a/include/fmt/core.h b/include/fmt/core.h index d6142a015d4db..22e519655f668 100644 --- a/include/fmt/core.h +++ b/include/fmt/core.h @@ -138,6 +138,24 @@ # endif #endif +// Check if typeid is available. +#ifndef FMT_USE_TYPEID +// In MSVC, typeid() is available with or without RTTI. +# if defined(_MSC_VER) +# define FMT_USE_TYPEID 1 +# elif defined(__RTTI) // EDG compilers. +# define FMT_USE_TYPEID 1 +# elif defined(__INTEL_RTTI__) // Intel compiler. +# define FMT_USE_TYPEID 1 +# elif defined(__GXX_RTTI) // G++. +# define FMT_USE_TYPEID 1 +# elif FMT_HAS_FEATURE(cxx_rtti) // Clang. +# define FMT_USE_TYPEID 1 +# else +# define FMT_USE_TYPEID 0 +# endif +#endif + // Disable [[noreturn]] on MSVC/NVCC because of bogus unreachable code warnings. #if FMT_EXCEPTIONS && FMT_HAS_CPP_ATTRIBUTE(noreturn) && !FMT_MSC_VERSION && \ !defined(__NVCC__) diff --git a/include/fmt/std.h b/include/fmt/std.h index ac3956507c599..795b956e8b547 100644 --- a/include/fmt/std.h +++ b/include/fmt/std.h @@ -274,7 +274,9 @@ struct formatter< if (it == end || *it == '}') return it; if (*it == 't') { ++it; +#if FMT_USE_TYPEID with_typename_ = true; +#endif } return it; } @@ -287,8 +289,9 @@ struct formatter< if (!with_typename_) return detail::write_bytes(out, string_view(ex.what()), spec); +#if FMT_USE_TYPEID const std::type_info& ti = typeid(ex); -#ifdef FMT_HAS_ABI_CXA_DEMANGLE +# ifdef FMT_HAS_ABI_CXA_DEMANGLE int status = 0; std::size_t size = 0; std::unique_ptr demangled_name_ptr( @@ -327,21 +330,22 @@ struct formatter< demangled_name_view = string_view(ti.name()); } out = detail::write_bytes(out, demangled_name_view, spec); -#elif FMT_MSC_VERSION +# elif FMT_MSC_VERSION string_view demangled_name_view(ti.name()); if (demangled_name_view.starts_with("class ")) demangled_name_view.remove_prefix(6); else if (demangled_name_view.starts_with("struct ")) demangled_name_view.remove_prefix(7); out = detail::write_bytes(out, demangled_name_view, spec); -#else +# else out = detail::write_bytes(out, string_view(ti.name()), spec); -#endif +# endif out = detail::write(out, Char(':')); out = detail::write(out, Char(' ')); out = detail::write_bytes(out, string_view(ex.what()), spec); return out; +#endif } }; FMT_END_NAMESPACE