Skip to content

Commit cb6fdf2

Browse files
authored
Restore constraint on map formatter (#4326)
* Restore constraint on map formatter * Remove unnecessary double parens
1 parent f841ae6 commit cb6fdf2

File tree

2 files changed

+13
-4
lines changed

2 files changed

+13
-4
lines changed

include/fmt/ranges.h

+3-1
Original file line numberDiff line numberDiff line change
@@ -527,7 +527,9 @@ struct formatter<
527527
template <typename R, typename Char>
528528
struct formatter<
529529
R, Char,
530-
enable_if_t<range_format_kind<R, Char>::value == range_format::map>> {
530+
enable_if_t<conjunction<
531+
bool_constant<range_format_kind<R, Char>::value == range_format::map>,
532+
detail::is_formattable_delayed<R, Char>>::value>> {
531533
private:
532534
using map_type = detail::maybe_const_range<R>;
533535
using element_type = detail::uncvref_type<map_type>;

test/ranges-test.cc

+10-3
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ TEST(ranges_test, format_array_of_literals) {
4747
}
4848
#endif // FMT_RANGES_TEST_ENABLE_C_STYLE_ARRAY
4949

50+
struct unformattable {};
51+
5052
TEST(ranges_test, format_vector) {
5153
auto v = std::vector<int>{1, 2, 3, 5, 7, 11};
5254
EXPECT_EQ(fmt::format("{}", v), "[1, 2, 3, 5, 7, 11]");
@@ -65,6 +67,9 @@ TEST(ranges_test, format_vector) {
6567
EXPECT_EQ(fmt::format("{:n}", vvc), "['a', 'b', 'c'], ['a', 'b', 'c']");
6668
EXPECT_EQ(fmt::format("{:n:n}", vvc), "'a', 'b', 'c', 'a', 'b', 'c'");
6769
EXPECT_EQ(fmt::format("{:n:n:}", vvc), "a, b, c, a, b, c");
70+
71+
EXPECT_FALSE(fmt::is_formattable<unformattable>::value);
72+
EXPECT_FALSE(fmt::is_formattable<std::vector<unformattable>>::value);
6873
}
6974

7075
TEST(ranges_test, format_nested_vector) {
@@ -83,6 +88,8 @@ TEST(ranges_test, format_map) {
8388
auto m = std::map<std::string, int>{{"one", 1}, {"two", 2}};
8489
EXPECT_EQ(fmt::format("{}", m), "{\"one\": 1, \"two\": 2}");
8590
EXPECT_EQ(fmt::format("{:n}", m), "\"one\": 1, \"two\": 2");
91+
92+
EXPECT_FALSE((fmt::is_formattable<std::map<int, unformattable>>::value));
8693
}
8794

8895
struct test_map_value {};
@@ -146,6 +153,7 @@ template <typename T> class flat_set {
146153
TEST(ranges_test, format_flat_set) {
147154
EXPECT_EQ(fmt::format("{}", flat_set<std::string>{"one", "two"}),
148155
"{\"one\", \"two\"}");
156+
EXPECT_FALSE(fmt::is_formattable<flat_set<unformattable>>::value);
149157
}
150158

151159
namespace adl {
@@ -169,8 +177,6 @@ TEST(ranges_test, format_pair) {
169177
EXPECT_EQ(fmt::format("{:n}", p), "421.5");
170178
}
171179

172-
struct unformattable {};
173-
174180
TEST(ranges_test, format_tuple) {
175181
auto t =
176182
std::tuple<int, float, std::string, char>(42, 1.5f, "this is tuple", 'i');
@@ -180,7 +186,6 @@ TEST(ranges_test, format_tuple) {
180186
EXPECT_EQ(fmt::format("{}", std::tuple<>()), "()");
181187

182188
EXPECT_TRUE((fmt::is_formattable<std::tuple<>>::value));
183-
EXPECT_FALSE((fmt::is_formattable<unformattable>::value));
184189
EXPECT_FALSE((fmt::is_formattable<std::tuple<unformattable>>::value));
185190
EXPECT_FALSE((fmt::is_formattable<std::tuple<unformattable, int>>::value));
186191
EXPECT_FALSE((fmt::is_formattable<std::tuple<int, unformattable>>::value));
@@ -655,6 +660,8 @@ TEST(ranges_test, container_adaptor) {
655660
m.push(2);
656661
EXPECT_EQ(fmt::format("{}", m), "[1, 2]");
657662
}
663+
664+
EXPECT_FALSE(fmt::is_formattable<std::stack<unformattable>>::value);
658665
}
659666

660667
struct tieable {

0 commit comments

Comments
 (0)