Skip to content

Commit

Permalink
Formatting of function pointers, member function pointers, member obj…
Browse files Browse the repository at this point in the history
…ect pointers... (#2610)
  • Loading branch information
AlexGuteniev authored Nov 23, 2021
1 parent 19cac63 commit a3ab36c
Show file tree
Hide file tree
Showing 3 changed files with 18 additions and 2 deletions.
7 changes: 5 additions & 2 deletions include/fmt/core.h
Original file line number Diff line number Diff line change
Expand Up @@ -1372,8 +1372,11 @@ template <typename Context> struct arg_mapper {
// the C array overload.
template <
typename T,
FMT_ENABLE_IF(std::is_convertible<const T&, const void*>::value &&
!std::is_convertible<const T&, const char_type*>::value)>
FMT_ENABLE_IF(
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 {
return {};
}
Expand Down
6 changes: 6 additions & 0 deletions test/compile-error-test/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,12 @@ expect_compile_error("
fmt::format(\"{}\", S());
")

# Formatting a function
expect_compile_error("
void (*f)();
fmt::format(\"{}\", f);
")

# Make sure that compiler features detected in the header
# match the features detected in CMake.
if (SUPPORTS_USER_DEFINED_LITERALS)
Expand Down
7 changes: 7 additions & 0 deletions test/core-test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -770,6 +770,13 @@ TEST(core_test, is_formattable) {
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 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"); }
Expand Down

0 comments on commit a3ab36c

Please sign in to comment.