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.
This commit is contained in:
Jonathan Wakely 2020-05-07 21:43:49 +01:00
parent 4cbc9d8b34
commit 9c24e97a97
4 changed files with 39 additions and 23 deletions

View 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.
@ -27,18 +49,6 @@
* 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:

View 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;
}

View 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

View 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