Some new algorithms need to use _GLIBCXX_STD_A to refer to the "normal"
version of the algorithm, to workaround the namespace dance done for
parallel mode.

        PR libstdc++/94971 (partial)
        * include/bits/ranges_algo.h (ranges::__sample_fn): Qualify
        std::sample using macro to work in parallel mode.
        (__sort_fn): Likewise for std::sort.
        (ranges::__nth_element_fn): Likewise for std::nth_element.
        * include/bits/stl_algobase.h (lexicographical_compare_three_way):
        Likewise for std::__min_cmp.
        * include/parallel/algobase.h (lexicographical_compare_three_way):
        Add to namespace std::__parallel.

Tested powerpc64le-linux, committed to master.

Probably not worth backporting. As noted in the bugzilla PR, parallel
mode remains pretty broken for C++20, and has issues even for C++11.
I'd like to deprecate it in favour of the C++17 parallel algos,
probably if/when we change the default to -std=gnu++17.


commit 9c24e97a97aaad4ad0500170cbae4f387d82ddd6
Author: Jonathan Wakely <jwak...@redhat.com>
Date:   Thu May 7 21:43:49 2020 +0100

    libstdc++: Fix some C++20 algorithms to work in parallel mode
    
    Some new algorithms need to use _GLIBCXX_STD_A to refer to the "normal"
    version of the algorithm, to workaround the namespace dance done for
    parallel mode.
    
            PR libstdc++/94971 (partial)
            * include/bits/ranges_algo.h (ranges::__sample_fn): Qualify
            std::sample using macro to work in parallel mode.
            (__sort_fn): Likewise for std::sort.
            (ranges::__nth_element_fn): Likewise for std::nth_element.
            * include/bits/stl_algobase.h (lexicographical_compare_three_way):
            Likewise for std::__min_cmp.
            * include/parallel/algobase.h (lexicographical_compare_three_way):
            Add to namespace std::__parallel.

diff --git a/libstdc++-v3/include/bits/ranges_algo.h 
b/libstdc++-v3/include/bits/ranges_algo.h
index aa07cb97ea6..c038a505afa 100644
--- a/libstdc++-v3/include/bits/ranges_algo.h
+++ b/libstdc++-v3/include/bits/ranges_algo.h
@@ -1758,8 +1758,9 @@ namespace ranges
            // FIXME: Forwarding to std::sample here requires computing __lasti
            // which may take linear time.
            auto __lasti = ranges::next(__first, __last);
-           return std::sample(std::move(__first), std::move(__lasti),
-                              std::move(__out), __n, std::forward<_Gen>(__g));
+           return _GLIBCXX_STD_A::
+             sample(std::move(__first), std::move(__lasti), std::move(__out),
+                    __n, std::forward<_Gen>(__g));
          }
        else
          {
@@ -2018,8 +2019,8 @@ namespace ranges
                 _Comp __comp = {}, _Proj __proj = {}) const
       {
        auto __lasti = ranges::next(__first, __last);
-       std::sort(std::move(__first), __lasti,
-                 __detail::__make_comp_proj(__comp, __proj));
+       _GLIBCXX_STD_A::sort(std::move(__first), __lasti,
+                            __detail::__make_comp_proj(__comp, __proj));
        return __lasti;
       }
 
@@ -2262,8 +2263,9 @@ namespace ranges
                 _Comp __comp = {}, _Proj __proj = {}) const
       {
        auto __lasti = ranges::next(__first, __last);
-       std::nth_element(std::move(__first), std::move(__nth), __lasti,
-                        __detail::__make_comp_proj(__comp, __proj));
+       _GLIBCXX_STD_A::nth_element(std::move(__first), std::move(__nth),
+                                   __lasti,
+                                   __detail::__make_comp_proj(__comp, __proj));
        return __lasti;
       }
 
diff --git a/libstdc++-v3/include/bits/stl_algobase.h 
b/libstdc++-v3/include/bits/stl_algobase.h
index 089ec2903f6..0a0e29923b8 100644
--- a/libstdc++-v3/include/bits/stl_algobase.h
+++ b/libstdc++-v3/include/bits/stl_algobase.h
@@ -1706,8 +1706,8 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO
          if constexpr (__is_byte_iter<_InputIter1>)
            if constexpr (__is_byte_iter<_InputIter2>)
              {
-               const auto [__len, __lencmp]
-                 = std::__min_cmp(__last1 - __first1, __last2 - __first2);
+               const auto [__len, __lencmp] = _GLIBCXX_STD_A::
+                 __min_cmp(__last1 - __first1, __last2 - __first2);
                if (__len)
                  {
                    const auto __c
@@ -1737,9 +1737,9 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO
                                      _InputIter2 __first2,
                                      _InputIter2 __last2)
     {
-      return std::lexicographical_compare_three_way(__first1, __last1,
-                                                   __first2, __last2,
-                                                   compare_three_way{});
+      return _GLIBCXX_STD_A::
+       lexicographical_compare_three_way(__first1, __last1, __first2, __last2,
+                                         compare_three_way{});
     }
 #endif // three_way_comparison
 
diff --git a/libstdc++-v3/include/parallel/algobase.h 
b/libstdc++-v3/include/parallel/algobase.h
index 06b1f3e3b5a..7e6fdd6e062 100644
--- a/libstdc++-v3/include/parallel/algobase.h
+++ b/libstdc++-v3/include/parallel/algobase.h
@@ -466,6 +466,10 @@ namespace __parallel
                __begin1, __end1, __begin2, __end2, __pred,
                _IteratorCategory1(), _IteratorCategory2());
     }
+
+#if __cpp_lib_three_way_comparison
+  using _GLIBCXX_STD_A::lexicographical_compare_three_way;
+#endif
 } // end namespace
 } // end namespace
 

Reply via email to