Skip to content

Commit

Permalink
Fix #4303: avoid instantiating formatter<const T> (#4325)
Browse files Browse the repository at this point in the history
  • Loading branch information
timsong-cpp authored Jan 24, 2025
1 parent a3d05d7 commit f841ae6
Show file tree
Hide file tree
Showing 2 changed files with 9 additions and 2 deletions.
2 changes: 1 addition & 1 deletion include/fmt/base.h
Original file line number Diff line number Diff line change
Expand Up @@ -1121,7 +1121,7 @@ using use_formatter =
bool_constant<(std::is_class<T>::value || std::is_enum<T>::value ||
std::is_union<T>::value || std::is_array<T>::value) &&
!has_to_string_view<T>::value && !is_named_arg<T>::value &&
!use_format_as<T>::value && !use_format_as_member<T>::value>;
!use_format_as<T>::value && !use_format_as_member<U>::value>;

template <typename Char, typename T, typename U = remove_const_t<T>>
auto has_formatter_impl(T* p, buffered_context<Char>* ctx = nullptr)
Expand Down
9 changes: 8 additions & 1 deletion test/std-test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,17 @@
#include <vector>

#include "fmt/os.h" // fmt::system_category
#include "fmt/ranges.h"
#include "gtest-extra.h" // StartsWith

#ifdef __cpp_lib_filesystem
TEST(std_test, path) {
using std::filesystem::path;
EXPECT_EQ(fmt::format("{}", path("/usr/bin")), "/usr/bin");

// see #4303
const path p = "/usr/bin";
EXPECT_EQ(fmt::format("{}", p), "/usr/bin");

EXPECT_EQ(fmt::format("{:?}", path("/usr/bin")), "\"/usr/bin\"");
EXPECT_EQ(fmt::format("{:8}", path("foo")), "foo ");

Expand All @@ -44,6 +48,9 @@ TEST(std_test, path) {
# endif
}

// Intentionally delayed include to test #4303
#include "fmt/ranges.h"

// Test ambiguity problem described in #2954.
TEST(ranges_std_test, format_vector_path) {
auto p = std::filesystem::path("foo/bar.txt");
Expand Down

0 comments on commit f841ae6

Please sign in to comment.