summaryrefslogtreecommitdiff
path: root/dev-libs/libfmt/files/libfmt-8.1.1-fix-static-assert.patch
diff options
context:
space:
mode:
Diffstat (limited to 'dev-libs/libfmt/files/libfmt-8.1.1-fix-static-assert.patch')
-rw-r--r--dev-libs/libfmt/files/libfmt-8.1.1-fix-static-assert.patch76
1 files changed, 76 insertions, 0 deletions
diff --git a/dev-libs/libfmt/files/libfmt-8.1.1-fix-static-assert.patch b/dev-libs/libfmt/files/libfmt-8.1.1-fix-static-assert.patch
new file mode 100644
index 000000000000..9f29d7fb111c
--- /dev/null
+++ b/dev-libs/libfmt/files/libfmt-8.1.1-fix-static-assert.patch
@@ -0,0 +1,76 @@
+https://github.com/fmtlib/fmt/commit/8f8a1a02d5c5cb967d240feee3ffac00d66f22a2.patch
+https://github.com/facebook/folly/issues/1705
+
+From 8f8a1a02d5c5cb967d240feee3ffac00d66f22a2 Mon Sep 17 00:00:00 2001
+From: Victor Zverovich <viz@fb.com>
+Date: Fri, 14 Jan 2022 13:08:14 -0800
+Subject: [PATCH] Fix handling of formattable types implicitly convertible to
+ pointers
+
+---
+ include/fmt/core.h | 5 +++--
+ test/core-test.cc | 21 ++++++++++++++++++++-
+ 2 files changed, 23 insertions(+), 3 deletions(-)
+
+diff --git a/include/fmt/core.h b/include/fmt/core.h
+index f2d21e5c5a..12571ce0da 100644
+--- a/include/fmt/core.h
++++ b/include/fmt/core.h
+@@ -1398,10 +1398,11 @@ template <typename Context> struct arg_mapper {
+ template <
+ typename T,
+ 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_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 {
+ return {};
+ }
+diff --git a/test/core-test.cc b/test/core-test.cc
+index b2f2097ea1..c9eea8ffd8 100644
+--- a/test/core-test.cc
++++ b/test/core-test.cc
+@@ -737,6 +737,24 @@ struct convertible_to_pointer {
+ 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 {};
+
+ TEST(core_test, is_formattable) {
+@@ -770,11 +788,12 @@ TEST(core_test, is_formattable) {
+ #endif
+
+ 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, "");
+
+ struct s;
+-
+ 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, "");
+