mirror of
https://github.com/fmtlib/fmt.git
synced 2025-01-04 17:40:35 +00:00
Trying to improve errors in the unformattable case (#3478)
This commit is contained in:
parent
e4c8cfe38e
commit
de4705f84d
@ -1548,6 +1548,11 @@ constexpr auto encode_types() -> unsigned long long {
|
||||
(encode_types<Context, Args...>() << packed_arg_bits);
|
||||
}
|
||||
|
||||
#if defined(__cpp_if_constexpr)
|
||||
// This type is intentionally undefined, only used for errors
|
||||
template <typename T, typename Char> struct type_is_unformattable_for;
|
||||
#endif
|
||||
|
||||
template <bool PACKED, typename Context, typename T, FMT_ENABLE_IF(PACKED)>
|
||||
FMT_CONSTEXPR FMT_INLINE auto make_arg(T& val) -> value<Context> {
|
||||
using arg_type = remove_cvref_t<decltype(arg_mapper<Context>().map(val))>;
|
||||
@ -1565,6 +1570,11 @@ FMT_CONSTEXPR FMT_INLINE auto make_arg(T& val) -> value<Context> {
|
||||
"Formatting of non-void pointers is disallowed.");
|
||||
|
||||
constexpr bool formattable = !std::is_same<arg_type, unformattable>::value;
|
||||
#if defined(__cpp_if_constexpr)
|
||||
if constexpr (!formattable) {
|
||||
type_is_unformattable_for<T, typename Context::char_type> _;
|
||||
}
|
||||
#endif
|
||||
static_assert(
|
||||
formattable,
|
||||
"Cannot format an argument. To make type T formattable provide a "
|
||||
@ -2529,7 +2539,17 @@ FMT_CONSTEXPR auto parse_format_specs(ParseContext& ctx)
|
||||
mapped_type_constant<T, context>::value != type::custom_type,
|
||||
decltype(arg_mapper<context>().map(std::declval<const T&>())),
|
||||
typename strip_named_arg<T>::type>;
|
||||
#if defined(__cpp_if_constexpr)
|
||||
if constexpr (std::is_default_constructible_v<
|
||||
formatter<mapped_type, char_type>>) {
|
||||
return formatter<mapped_type, char_type>().parse(ctx);
|
||||
} else {
|
||||
type_is_unformattable_for<T, char_type> _;
|
||||
return ctx.begin();
|
||||
}
|
||||
#else
|
||||
return formatter<mapped_type, char_type>().parse(ctx);
|
||||
#endif
|
||||
}
|
||||
|
||||
// Checks char specs and returns true iff the presentation type is char-like.
|
||||
|
Loading…
Reference in New Issue
Block a user