Skip to content

Commit

Permalink
Use typeid() only if it's available
Browse files Browse the repository at this point in the history
On MSVC it is always available, otherwise it depends on whether
RTTI is enabled.
  • Loading branch information
danakj committed May 31, 2023
1 parent bd39345 commit 9aa817d
Showing 1 changed file with 25 additions and 5 deletions.
30 changes: 25 additions & 5 deletions include/fmt/std.h
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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;
}
Expand All @@ -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<char, decltype(&std::free)> demangled_name_ptr(
Expand Down Expand Up @@ -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<Char>(out, Char(':'));
out = detail::write<Char>(out, Char(' '));
out = detail::write_bytes(out, string_view(ex.what()), spec);

return out;
#endif
}
};
FMT_END_NAMESPACE
Expand Down

0 comments on commit 9aa817d

Please sign in to comment.