libstdc++: Fix some C++20 algorithms to work in parallel mode
authorJonathan Wakely <jwakely@redhat.com>
Thu, 7 May 2020 20:43:49 +0000 (21:43 +0100)
committerJonathan Wakely <jwakely@redhat.com>
Thu, 7 May 2020 20:43:49 +0000 (21:43 +0100)
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.

libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/ranges_algo.h
libstdc++-v3/include/bits/stl_algobase.h
libstdc++-v3/include/parallel/algobase.h

index d0751909dd2dc74fa350581a9fd69354208bc334..3b8e6d94f875fb6edddd00500fb0ffcc8c856dd1 100644 (file)
@@ -1,3 +1,25 @@
+2020-05-07  Jonathan Wakely  <jwakely@redhat.com>
+
+       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.
+
+       PR c/92472
+       * include/parallel/multiway_merge.h (_GuardedIterator::operator*)
+       (_GuardedIterator::operator _RAIter, _UnguardedIterator::operator*)
+       (_UnguardedIterator::operator _RAIter): Add const qualifier.
+       (operator<(_GuardedIterator&, _GuardedIterator&)
+       (operator<=(_GuardedIterator&, _GuardedIterator&)
+       (operator<(_UnguardedIterator&, _UnguardedIterator&)
+       (operator<=(_UnguardedIterator&, _UnguardedIterator&): Change
+       parameters to const references.
+
 2020-05-07  Eric Botcazou  <ebotcazou@adacore.com>
 
        * config/abi/post/sparc64-linux-gnu/baseline_symbols.txt: Update.
        * config/abi/post/sparc-solaris/sparcv9/baseline_symbols.txt:
        Likewise.
 
-2020-05-07  Jonathan Wakely  <jwakely@redhat.com>
-
-       PR c/92472
-       * include/parallel/multiway_merge.h (_GuardedIterator::operator*)
-       (_GuardedIterator::operator _RAIter, _UnguardedIterator::operator*)
-       (_UnguardedIterator::operator _RAIter): Add const qualifier.
-       (operator<(_GuardedIterator&, _GuardedIterator&)
-       (operator<=(_GuardedIterator&, _GuardedIterator&)
-       (operator<(_UnguardedIterator&, _UnguardedIterator&)
-       (operator<=(_UnguardedIterator&, _UnguardedIterator&): Change
-       parameters to const references.
-
 2020-05-06  Martin Liska  <mliska@suse.cz>
 
        Revert:
index aa07cb97ea69dc9398d9785e8ed158de759df96d..c038a505afa2a9bee58600df351c5d3489ba4d55 100644 (file)
@@ -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;
       }
 
index 089ec2903f6ea7fffae725ebf6e14d7f7c751071..0a0e29923b8c94b52c2da9e08ff1274def3fea34 100644 (file)
@@ -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
 
index 06b1f3e3b5ace5088b5edb30626d5e0e2f810965..7e6fdd6e0623f14a9ef448291354a93bbc5e4466 100644 (file)
@@ -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