~ruther/guix-local

da3e6aea0a750246e8a9120d62441c3df65faff0 — Efraim Flashner 2 years ago c0f3c0c
gnu: range-v3: Update to 0.12.0.

* gnu/packages/cpp.scm (range-v3): Update to 0.12.0.
[source]: Remove patch.
* gnu/packages/patches/range-v3-build-with-gcc10.patch: Remove file.
* gnu/local.mk (dist_patch_DATA): Remove it.

Change-Id: I078937f9aff0da31ede8d472d8739e48bb775c55
3 files changed, 3 insertions(+), 127 deletions(-)

M gnu/local.mk
M gnu/packages/cpp.scm
D gnu/packages/patches/range-v3-build-with-gcc10.patch
M gnu/local.mk => gnu/local.mk +0 -1
@@ 1957,7 1957,6 @@ dist_patch_DATA =						\
  %D%/packages/patches/qtwayland-cleanup-callbacks.patch	\
  %D%/packages/patches/ragel-char-signedness.patch		\
  %D%/packages/patches/randomjungle-disable-static-build.patch	\
  %D%/packages/patches/range-v3-build-with-gcc10.patch	\
  %D%/packages/patches/raptor2-heap-overflow.patch		\
  %D%/packages/patches/ratpoints-sturm_and_rp_private.patch	\
  %D%/packages/patches/ratpoison-shell.patch			\

M gnu/packages/cpp.scm => gnu/packages/cpp.scm +3 -4
@@ 25,7 25,7 @@
;;; Copyright © 2021 jgart <jgart@dismail.de>
;;; Copyright © 2021 Julien Lepiller <julien@lepiller.eu>
;;; Copyright © 2021 Disseminate Dissent <disseminatedissent@protonmail.com>
;;; Copyright © 2022, 2023 Efraim Flashner <efraim@flashner.co.il>
;;; Copyright © 2022-2024 Efraim Flashner <efraim@flashner.co.il>
;;; Copyright © 2022 muradm <mail@muradm.net>
;;; Copyright © 2022 Attila Lendvai <attila@lendvai.name>
;;; Copyright © 2022 Arun Isaac <arunisaac@systemreboot.net>


@@ 187,7 187,7 @@ development effort.")
(define-public range-v3
  (package
    (name "range-v3")
    (version "0.11.0")
    (version "0.12.0")
    (source
     (origin
       (method git-fetch)


@@ 195,9 195,8 @@ development effort.")
             (url "https://github.com/ericniebler/range-v3.git")
             (commit version)))
       (file-name (git-file-name name version))
       (patches (search-patches "range-v3-build-with-gcc10.patch"))
       (sha256
        (base32 "18230bg4rq9pmm5f8f65j444jpq56rld4fhmpham8q3vr1c1bdjh"))))
        (base32 "0r85s5rmp5ixmik2y5y4w760pa38j1sg9hbr1fss2flibzvrf53d"))))
    (build-system cmake-build-system)
    (arguments
     (list

D gnu/packages/patches/range-v3-build-with-gcc10.patch => gnu/packages/patches/range-v3-build-with-gcc10.patch +0 -122
@@ 1,122 0,0 @@
From 0487cca29e352e8f16bbd91fda38e76e39a0ed28 Mon Sep 17 00:00:00 2001
From: Louis Dionne <ldionne.2@gmail.com>
Date: Tue, 15 Jun 2021 14:40:01 -0400
Subject: [PATCH] Work around broken integration with latest libc++. (#1635)

* Work around broken integration with latest libc++.

In newer versions of libc++, the base template of std::iterator_traits
provides a member typedef called __primary_template which is an alias
to the std::iterator_traits specialization itself. This fix works with
both the old version of libc++ and the new one.

Fixes issue #1633.

* Fix is_std_iterator_traits_specialized_v on MSVC

It used to pretend that std::iterator_traits<T*> is a user-defined
specialization, which isn't the case. This is due to MSVC's
iterator_traits<T*> specialization not posing as the base template.
---
 include/std/detail/associated_types.hpp | 22 +++++++++++-----
 test/CMakeLists.txt                     |  1 +
 test/bug1633.cpp                        | 34 +++++++++++++++++++++++++
 3 files changed, 51 insertions(+), 6 deletions(-)
 create mode 100644 test/bug1633.cpp

diff --git a/include/std/detail/associated_types.hpp b/include/std/detail/associated_types.hpp
index b642166d4..449a3f91c 100644
--- a/include/std/detail/associated_types.hpp
+++ b/include/std/detail/associated_types.hpp
@@ -265,11 +265,22 @@ namespace ranges
         template<typename I>
         char is_std_iterator_traits_specialized_impl_(void *);
 #elif defined(_LIBCPP_VERSION)
-        template<typename I, bool B>
-        char (
-            &is_std_iterator_traits_specialized_impl_(std::__iterator_traits<I, B> *))[2];
+        // In older versions of libc++, the base template inherits from std::__iterator_traits<typename, bool>.
+        template<template<typename, bool> class IteratorTraitsBase, typename I, bool B>
+        char (&libcpp_iterator_traits_base_impl(IteratorTraitsBase<I, B> *))[2];
+        template<template<typename, bool> class IteratorTraitsBase, typename I>
+        char libcpp_iterator_traits_base_impl(void *);
+
+        // In newer versions, the base template has only one template parameter and provides the
+        // __primary_template typedef which aliases the iterator_traits specialization.
+        template<template<typename> class, typename I>
+        char (&libcpp_iterator_traits_base_impl(typename std::iterator_traits<I>::__primary_template *))[2];
+        template<template<typename> class, typename I>
+        char libcpp_iterator_traits_base_impl(void *);
+
         template<typename I>
-        char is_std_iterator_traits_specialized_impl_(void *);
+        auto is_std_iterator_traits_specialized_impl_(std::iterator_traits<I>* traits)
+            -> decltype(libcpp_iterator_traits_base_impl<std::__iterator_traits, I>(traits));
 #elif defined(_MSVC_STL_VERSION)
         template<typename I>
         char (&is_std_iterator_traits_specialized_impl_(
@@ -287,14 +298,13 @@ namespace ranges
         RANGES_INLINE_VAR constexpr bool is_std_iterator_traits_specialized_v =
             1 == sizeof(is_std_iterator_traits_specialized_impl_<I>(
                      static_cast<std::iterator_traits<I> *>(nullptr)));
-
+#endif
         // The standard iterator_traits<T *> specialization(s) do not count
         // as user-specialized. This will no longer be necessary in C++20.
         // This helps with `T volatile*` and `void *`.
         template<typename T>
         RANGES_INLINE_VAR constexpr bool is_std_iterator_traits_specialized_v<T *> =
             false;
-#endif
     } // namespace detail
     /// \endcond
 } // namespace ranges
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
index 889f314af..2c2b7c09c 100644
--- a/test/CMakeLists.txt
+++ b/test/CMakeLists.txt
@@ -19,3 +19,4 @@ rv3_add_test(test.bug474 bug474 bug474.cpp)
 rv3_add_test(test.bug566 bug566 bug566.cpp)
 rv3_add_test(test.bug1322 bug1322 bug1322.cpp)
 rv3_add_test(test.bug1335 bug1335 bug1335.cpp)
+rv3_add_test(test.bug1633 bug1633 bug1633.cpp)
diff --git a/test/bug1633.cpp b/test/bug1633.cpp
new file mode 100644
index 000000000..be52420ad
--- /dev/null
+++ b/test/bug1633.cpp
@@ -0,0 +1,34 @@
+// Range v3 library
+//
+//  Use, modification and distribution is subject to the
+//  Boost Software License, Version 1.0. (See accompanying
+//  file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+//
+// Project home: https://github.com/ericniebler/range-v3
+
+#include <cstddef>
+#include <iterator>
+#include <range/v3/iterator.hpp>
+
+struct X { };
+
+namespace std {
+    template<> struct iterator_traits<X> { };
+}
+
+struct Y {
+    using difference_type = std::ptrdiff_t;
+    using value_type = int;
+    using pointer = int*;
+    using reference = int&;
+    using iterator_category = std::forward_iterator_tag;
+};
+
+static_assert(ranges::detail::is_std_iterator_traits_specialized_v<X>, "");
+static_assert(!ranges::detail::is_std_iterator_traits_specialized_v<Y>, "");
+static_assert(!ranges::detail::is_std_iterator_traits_specialized_v<int*>, "");
+
+int main()
+{
+}