Formatting of function pointers, member function pointers, member object pointers... (#2610)

This commit is contained in:
Alex Guteniev 2021-11-23 22:55:22 +02:00 committed by GitHub
parent 19cac63fe4
commit a3ab36c803
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 18 additions and 2 deletions

View File

@ -1372,8 +1372,11 @@ template <typename Context> struct arg_mapper {
// the C array overload. // the C array overload.
template < template <
typename T, typename T,
FMT_ENABLE_IF(std::is_convertible<const T&, const void*>::value && FMT_ENABLE_IF(
!std::is_convertible<const T&, const char_type*>::value)> std::is_member_pointer<T>::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 char_type*>::value))>
FMT_CONSTEXPR auto map(const T&) -> unformattable_pointer { FMT_CONSTEXPR auto map(const T&) -> unformattable_pointer {
return {}; return {};
} }

View File

@ -67,6 +67,12 @@ expect_compile_error("
fmt::format(\"{}\", S()); fmt::format(\"{}\", S());
") ")
# Formatting a function
expect_compile_error("
void (*f)();
fmt::format(\"{}\", f);
")
# Make sure that compiler features detected in the header # Make sure that compiler features detected in the header
# match the features detected in CMake. # match the features detected in CMake.
if (SUPPORTS_USER_DEFINED_LITERALS) if (SUPPORTS_USER_DEFINED_LITERALS)

View File

@ -770,6 +770,13 @@ TEST(core_test, is_formattable) {
static_assert(!fmt::is_formattable<unsigned char*, wchar_t>::value, ""); static_assert(!fmt::is_formattable<unsigned char*, wchar_t>::value, "");
static_assert(!fmt::is_formattable<const signed char*, wchar_t>::value, ""); static_assert(!fmt::is_formattable<const signed char*, wchar_t>::value, "");
static_assert(!fmt::is_formattable<const unsigned char*, wchar_t>::value, ""); static_assert(!fmt::is_formattable<const unsigned char*, wchar_t>::value, "");
static_assert(!fmt::is_formattable<void (*)()>::value, "");
struct s;
static_assert(!fmt::is_formattable<int(s::*)>::value, "");
static_assert(!fmt::is_formattable<int (s::*)()>::value, "");
} }
TEST(core_test, format) { EXPECT_EQ(fmt::format("{}", 42), "42"); } TEST(core_test, format) { EXPECT_EQ(fmt::format("{}", 42), "42"); }