commit: ce8adefaa0637e141a52d5d88281d3049eab5c41 Author: Conrad Kostecki <conikost <AT> gentoo <DOT> org> AuthorDate: Thu May 1 10:53:38 2025 +0000 Commit: Conrad Kostecki <conikost <AT> gentoo <DOT> org> CommitDate: Thu May 1 10:55:15 2025 +0000 URL: https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=ce8adefa
dev-cpp/nlohmann_json: add patch for missing char8_t support Closes: https://bugs.gentoo.org/954217 Signed-off-by: Conrad Kostecki <conikost <AT> gentoo.org> ...mann_json-3.12.0-fallback-missing-char8_t.patch | 141 +++++++++++++++++++++ ....12.0.ebuild => nlohmann_json-3.12.0-r1.ebuild} | 2 + 2 files changed, 143 insertions(+) diff --git a/dev-cpp/nlohmann_json/files/nlohmann_json-3.12.0-fallback-missing-char8_t.patch b/dev-cpp/nlohmann_json/files/nlohmann_json-3.12.0-fallback-missing-char8_t.patch new file mode 100644 index 000000000000..afb1491e10af --- /dev/null +++ b/dev-cpp/nlohmann_json/files/nlohmann_json-3.12.0-fallback-missing-char8_t.patch @@ -0,0 +1,141 @@ +From 756ca22ec5b0d89b5d107b4c30891d1293650c87 Mon Sep 17 00:00:00 2001 +From: Sergiu Deitsch <[email protected]> +Date: Wed, 23 Apr 2025 18:36:41 +0200 +Subject: [PATCH] Provide fallback for missing `char8_t` support (#4736) + +--- + .../nlohmann/detail/conversions/from_json.hpp | 5 +++- + .../nlohmann/detail/conversions/to_json.hpp | 21 ++++++++++----- + single_include/nlohmann/json.hpp | 26 +++++++++++++------ + tests/src/unit-deserialization.cpp | 5 ++-- + 4 files changed, 39 insertions(+), 18 deletions(-) + +diff --git a/include/nlohmann/detail/conversions/from_json.hpp b/include/nlohmann/detail/conversions/from_json.hpp +index 797f714dfa..3a24a6f4d2 100644 +--- a/include/nlohmann/detail/conversions/from_json.hpp ++++ b/include/nlohmann/detail/conversions/from_json.hpp +@@ -539,7 +539,10 @@ inline void from_json(const BasicJsonType& j, std_fs::path& p) + JSON_THROW(type_error::create(302, concat("type must be string, but is ", j.type_name()), &j)); + } + const auto& s = *j.template get_ptr<const typename BasicJsonType::string_t*>(); +-#ifdef JSON_HAS_CPP_20 ++ // Checking for C++20 standard or later can be insufficient in case the ++ // library support for char8_t is either incomplete or was disabled ++ // altogether. Use the __cpp_lib_char8_t feature test instead. ++#if defined(__cpp_lib_char8_t) && (__cpp_lib_char8_t >= 201907L) + p = std_fs::path(std::u8string_view(reinterpret_cast<const char8_t*>(s.data()), s.size())); + #else + p = std_fs::u8path(s); // accepts UTF-8 encoded std::string in C++17, deprecated in C++20 +diff --git a/include/nlohmann/detail/conversions/to_json.hpp b/include/nlohmann/detail/conversions/to_json.hpp +index f8413850d5..8b910dd161 100644 +--- a/include/nlohmann/detail/conversions/to_json.hpp ++++ b/include/nlohmann/detail/conversions/to_json.hpp +@@ -15,7 +15,8 @@ + + #include <algorithm> // copy + #include <iterator> // begin, end +-#include <string> // string ++#include <memory> // allocator_traits ++#include <string> // basic_string, char_traits + #include <tuple> // tuple, get + #include <type_traits> // is_same, is_constructible, is_floating_point, is_enum, underlying_type + #include <utility> // move, forward, declval, pair +@@ -440,15 +441,21 @@ inline void to_json(BasicJsonType& j, const T& t) + } + + #if JSON_HAS_FILESYSTEM || JSON_HAS_EXPERIMENTAL_FILESYSTEM ++#if defined(__cpp_lib_char8_t) ++template<typename BasicJsonType, typename Tr, typename Allocator> ++inline void to_json(BasicJsonType& j, const std::basic_string<char8_t, Tr, Allocator>& s) ++{ ++ using OtherAllocator = typename std::allocator_traits<Allocator>::template rebind_alloc<char>; ++ j = std::basic_string<char, std::char_traits<char>, OtherAllocator>(s.begin(), s.end(), s.get_allocator()); ++} ++#endif ++ + template<typename BasicJsonType> + inline void to_json(BasicJsonType& j, const std_fs::path& p) + { +-#ifdef JSON_HAS_CPP_20 +- const std::u8string s = p.u8string(); +- j = std::string(s.begin(), s.end()); +-#else +- j = p.u8string(); // returns std::string in C++17 +-#endif ++ // Returns either a std::string or a std::u8string depending whether library ++ // support for char8_t is enabled. ++ j = p.u8string(); + } + #endif + +diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp +index 13b07c0fbc..93e5983cf1 100644 +--- a/single_include/nlohmann/json.hpp ++++ b/single_include/nlohmann/json.hpp +@@ -5324,7 +5324,10 @@ inline void from_json(const BasicJsonType& j, std_fs::path& p) + JSON_THROW(type_error::create(302, concat("type must be string, but is ", j.type_name()), &j)); + } + const auto& s = *j.template get_ptr<const typename BasicJsonType::string_t*>(); +-#ifdef JSON_HAS_CPP_20 ++ // Checking for C++20 standard or later can be insufficient in case the ++ // library support for char8_t is either incomplete or was disabled ++ // altogether. Use the __cpp_lib_char8_t feature test instead. ++#if defined(__cpp_lib_char8_t) && (__cpp_lib_char8_t >= 201907L) + p = std_fs::path(std::u8string_view(reinterpret_cast<const char8_t*>(s.data()), s.size())); + #else + p = std_fs::u8path(s); // accepts UTF-8 encoded std::string in C++17, deprecated in C++20 +@@ -5379,7 +5382,8 @@ NLOHMANN_JSON_NAMESPACE_END + + #include <algorithm> // copy + #include <iterator> // begin, end +-#include <string> // string ++#include <memory> // allocator_traits ++#include <string> // basic_string, char_traits + #include <tuple> // tuple, get + #include <type_traits> // is_same, is_constructible, is_floating_point, is_enum, underlying_type + #include <utility> // move, forward, declval, pair +@@ -6086,15 +6090,21 @@ inline void to_json(BasicJsonType& j, const T& t) + } + + #if JSON_HAS_FILESYSTEM || JSON_HAS_EXPERIMENTAL_FILESYSTEM ++#if defined(__cpp_lib_char8_t) ++template<typename BasicJsonType, typename Tr, typename Allocator> ++inline void to_json(BasicJsonType& j, const std::basic_string<char8_t, Tr, Allocator>& s) ++{ ++ using OtherAllocator = typename std::allocator_traits<Allocator>::template rebind_alloc<char>; ++ j = std::basic_string<char, std::char_traits<char>, OtherAllocator>(s.begin(), s.end(), s.get_allocator()); ++} ++#endif ++ + template<typename BasicJsonType> + inline void to_json(BasicJsonType& j, const std_fs::path& p) + { +-#ifdef JSON_HAS_CPP_20 +- const std::u8string s = p.u8string(); +- j = std::string(s.begin(), s.end()); +-#else +- j = p.u8string(); // returns std::string in C++17 +-#endif ++ // Returns either a std::string or a std::u8string depending whether library ++ // support for char8_t is enabled. ++ j = p.u8string(); + } + #endif + +diff --git a/tests/src/unit-deserialization.cpp b/tests/src/unit-deserialization.cpp +index 84a970a183..5c450c23d3 100644 +--- a/tests/src/unit-deserialization.cpp ++++ b/tests/src/unit-deserialization.cpp +@@ -1134,9 +1134,10 @@ TEST_CASE("deserialization") + } + } + +-// select the types to test - char8_t is only available in C++20 ++// select the types to test - char8_t is only available since C++20 if and only ++// if __cpp_char8_t is defined. + #define TYPE_LIST(...) __VA_ARGS__ +-#ifdef JSON_HAS_CPP_20 ++#if defined(__cpp_char8_t) && (__cpp_char8_t >= 201811L) + #define ASCII_TYPES TYPE_LIST(char, wchar_t, char16_t, char32_t, char8_t) + #else + #define ASCII_TYPES TYPE_LIST(char, wchar_t, char16_t, char32_t) diff --git a/dev-cpp/nlohmann_json/nlohmann_json-3.12.0.ebuild b/dev-cpp/nlohmann_json/nlohmann_json-3.12.0-r1.ebuild similarity index 96% rename from dev-cpp/nlohmann_json/nlohmann_json-3.12.0.ebuild rename to dev-cpp/nlohmann_json/nlohmann_json-3.12.0-r1.ebuild index 75276652d6fc..70f098895022 100644 --- a/dev-cpp/nlohmann_json/nlohmann_json-3.12.0.ebuild +++ b/dev-cpp/nlohmann_json/nlohmann_json-3.12.0-r1.ebuild @@ -28,6 +28,8 @@ RESTRICT="!test? ( test )" DOCS=( ChangeLog.md README.md ) +PATCHES=( "${FILESDIR}/${PN}-3.12.0-fallback-missing-char8_t.patch" ) + src_prepare() { if use test ; then ln -s "${WORKDIR}"/json_test_data-${TEST_VERSION} "${S}"/json_test_data || die
