git: a9aee8de59cd - 2024Q3 - devel/libxsd-frontend: fix build with libc++ 19
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Sat, 28 Sep 2024 09:48:46 UTC
The branch 2024Q3 has been updated by dim:
URL: https://cgit.FreeBSD.org/ports/commit/?id=a9aee8de59cd8992947417704a0e7d86c13d221a
commit a9aee8de59cd8992947417704a0e7d86c13d221a
Author: Dimitry Andric <dim@FreeBSD.org>
AuthorDate: 2024-09-13 10:36:00 +0000
Commit: Dimitry Andric <dim@FreeBSD.org>
CommitDate: 2024-09-28 09:48:23 +0000
devel/libxsd-frontend: fix build with libc++ 19
As noted in the libc++ 19 release notes [1], std::char_traits<> is now
only provided for char, char8_t, char16_t, char32_t and wchar_t, and any
instantiation for other types will fail.
This causes www/qt5-webengine to fail to compile with clang 19 and
libc++ 19, resulting in errors similar to:
/usr/include/c++/v1/string:820:42: error: implicit instantiation of undefined template 'std::char_traits<XSDFrontend::Bits::None>'
820 | static_assert(is_same<_CharT, typename traits_type::char_type>::value,
| ^
/wrkdirs/usr/ports/devel/libxsd-frontend/work/libxsd-frontend-2.1.0/libxsd-frontend/xml.hxx:100:23: note: in instantiation of template class 'std::basic_string<XSDFrontend::Bits::None>' requested here
100 | NarrowString r (s);
| ^
/usr/include/c++/v1/__fwd/string.h:23:29: note: template is declared here
23 | struct _LIBCPP_TEMPLATE_VIS char_traits;
| ^
The `Bits::None` construct used by libxsd-frontend is meant to disable
unwanted conversions, but it no longer works if `std::char_traits>` is
undefined for this type.
Fix it by removing the `Bits` namespace and only enabling the converting
constructors if the first type of `StringTemplate` is `wchar_t`.
[1] https://libcxx.llvm.org/ReleaseNotes/19.html#deprecations-and-removals
PR: 281478
Approved by: maintainer timeout (2 weeks)
MFH: 2024Q3
(cherry picked from commit c1c4aae636e9e8c5fc146caeb9ad734e20f97115)
---
.../files/patch-libxsd-frontend_types.hxx | 62 ++++++++++++++++++++++
1 file changed, 62 insertions(+)
diff --git a/devel/libxsd-frontend/files/patch-libxsd-frontend_types.hxx b/devel/libxsd-frontend/files/patch-libxsd-frontend_types.hxx
new file mode 100644
index 000000000000..6162dbf7fe56
--- /dev/null
+++ b/devel/libxsd-frontend/files/patch-libxsd-frontend_types.hxx
@@ -0,0 +1,62 @@
+--- libxsd-frontend/types.hxx.orig 2022-08-19 06:30:48 UTC
++++ libxsd-frontend/types.hxx
+@@ -13,38 +13,13 @@ namespace XSDFrontend
+ {
+ using std::size_t;
+
+- namespace Bits
+- {
+- struct None {};
+-
+- template <typename C>
+- struct NarrowerChar
+- {
+- typedef None Type;
+- };
+-
+- template <>
+- struct NarrowerChar<wchar_t>
+- {
+- typedef char Type;
+- };
+- }
+-
+ struct LIBXSD_FRONTEND_SYMEXPORT NonRepresentable: std::exception
+ {
+ virtual char const*
+ what () const throw ();
+ };
+
+- template <typename C, typename NC = typename Bits::NarrowerChar<C>::Type>
+- class StringTemplate;
+-
+- template <>
+- class StringTemplate<Bits::None, Bits::None>
+- {
+- };
+-
+- template <typename C, typename NC>
++ template <typename C, typename NC = char>
+ class StringTemplate : public std::basic_string<C>
+ {
+ typedef std::basic_string<C> Base;
+@@ -114,16 +89,19 @@ namespace XSDFrontend
+
+ // Conversion from the Narrower type. Experimental.
+ //
++ template<typename WC = C, typename = std::enable_if_t<std::is_same_v<WC, wchar_t>>>
+ StringTemplate (NC const* s)
+ {
+ from_narrow (s);
+ }
+
++ template<typename WC = C, typename = std::enable_if_t<std::is_same_v<WC, wchar_t>>>
+ StringTemplate (StringTemplate<NC> const& other)
+ {
+ from_narrow (other.c_str ());
+ }
+
++ template<typename WC = C, typename = std::enable_if_t<std::is_same_v<WC, wchar_t>>>
+ StringTemplate (NarrowerBase const& other)
+ {
+ from_narrow (other.c_str ());