diff --git a/include/fmt/core.h b/include/fmt/core.h index d6142a015d4d..4961310a311f 100644 --- a/include/fmt/core.h +++ b/include/fmt/core.h @@ -1786,7 +1786,7 @@ class format_arg_store basic_format_args(*this), #endif data_{detail::make_arg(args)...} { - if (num_named_args != 0) + if (detail::const_check(num_named_args != 0)) detail::init_named_args(data_.named_args(), 0, 0, args...); } }; diff --git a/include/fmt/std.h b/include/fmt/std.h index ac3956507c59..d3fda351032f 100644 --- a/include/fmt/std.h +++ b/include/fmt/std.h @@ -44,6 +44,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 + #ifdef __cpp_lib_filesystem FMT_BEGIN_NAMESPACE @@ -274,7 +292,7 @@ struct formatter< if (it == end || *it == '}') return it; if (*it == 't') { ++it; - with_typename_ = true; + with_typename_ = FMT_USE_TYPEID != 0; } return it; } @@ -287,8 +305,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 +346,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