mirror of
https://github.com/fmtlib/fmt.git
synced 2025-02-20 18:40:44 +00:00
Fix handling of formattable types implicitly convertible to pointers
This commit is contained in:
parent
b02e5af52c
commit
8f8a1a02d5
@ -1398,10 +1398,11 @@ template <typename Context> struct arg_mapper {
|
|||||||
template <
|
template <
|
||||||
typename T,
|
typename T,
|
||||||
FMT_ENABLE_IF(
|
FMT_ENABLE_IF(
|
||||||
std::is_member_pointer<T>::value ||
|
std::is_pointer<T>::value || std::is_member_pointer<T>::value ||
|
||||||
std::is_function<typename std::remove_pointer<T>::type>::value ||
|
std::is_function<typename std::remove_pointer<T>::type>::value ||
|
||||||
(std::is_convertible<const T&, const void*>::value &&
|
(std::is_convertible<const T&, const void*>::value &&
|
||||||
!std::is_convertible<const T&, const char_type*>::value))>
|
!std::is_convertible<const T&, const char_type*>::value &&
|
||||||
|
!has_formatter<T, Context>::value))>
|
||||||
FMT_CONSTEXPR auto map(const T&) -> unformattable_pointer {
|
FMT_CONSTEXPR auto map(const T&) -> unformattable_pointer {
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
@ -737,6 +737,24 @@ struct convertible_to_pointer {
|
|||||||
operator const int*() const { return nullptr; }
|
operator const int*() const { return nullptr; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct convertible_to_pointer_formattable {
|
||||||
|
operator const int*() const { return nullptr; }
|
||||||
|
};
|
||||||
|
|
||||||
|
FMT_BEGIN_NAMESPACE
|
||||||
|
template <> struct formatter<convertible_to_pointer_formattable> {
|
||||||
|
auto parse(format_parse_context& ctx) -> decltype(ctx.begin()) {
|
||||||
|
return ctx.begin();
|
||||||
|
}
|
||||||
|
|
||||||
|
auto format(convertible_to_pointer_formattable, format_context& ctx) const
|
||||||
|
-> decltype(ctx.out()) {
|
||||||
|
auto test = string_view("test");
|
||||||
|
return std::copy_n(test.data(), test.size(), ctx.out());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
FMT_END_NAMESPACE
|
||||||
|
|
||||||
enum class test_scoped_enum {};
|
enum class test_scoped_enum {};
|
||||||
|
|
||||||
TEST(core_test, is_formattable) {
|
TEST(core_test, is_formattable) {
|
||||||
@ -770,11 +788,12 @@ TEST(core_test, is_formattable) {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
static_assert(!fmt::is_formattable<convertible_to_pointer>::value, "");
|
static_assert(!fmt::is_formattable<convertible_to_pointer>::value, "");
|
||||||
|
const auto f = convertible_to_pointer_formattable();
|
||||||
|
EXPECT_EQ(fmt::format("{}", f), "test");
|
||||||
|
|
||||||
static_assert(!fmt::is_formattable<void (*)()>::value, "");
|
static_assert(!fmt::is_formattable<void (*)()>::value, "");
|
||||||
|
|
||||||
struct s;
|
struct s;
|
||||||
|
|
||||||
static_assert(!fmt::is_formattable<int(s::*)>::value, "");
|
static_assert(!fmt::is_formattable<int(s::*)>::value, "");
|
||||||
static_assert(!fmt::is_formattable<int (s::*)()>::value, "");
|
static_assert(!fmt::is_formattable<int (s::*)()>::value, "");
|
||||||
static_assert(!fmt::is_formattable<test_scoped_enum>::value, "");
|
static_assert(!fmt::is_formattable<test_scoped_enum>::value, "");
|
||||||
|
Loading…
x
Reference in New Issue
Block a user