Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 28 Sep 2024 09:48:46 GMT
From:      Dimitry Andric <dim@FreeBSD.org>
To:        ports-committers@FreeBSD.org, dev-commits-ports-all@FreeBSD.org, dev-commits-ports-branches@FreeBSD.org
Subject:   git: a9aee8de59cd - 2024Q3 - devel/libxsd-frontend: fix build with libc++ 19
Message-ID:  <202409280948.48S9mkrh011602@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
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 ());



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202409280948.48S9mkrh011602>