libstdc++: Avoid double-deref of __first in ranges::minmax [PR104858]
PR libstdc++/104858 libstdc++-v3/ChangeLog: * include/bits/ranges_algo.h (__minmax_fn): Avoid dereferencing __first twice at the start. * testsuite/25_algorithms/minmax/constrained.cc (test06): New test.
This commit is contained in:
parent
eb3f2e9348
commit
7e76cef873
2 changed files with 31 additions and 1 deletions
|
@ -3084,7 +3084,7 @@ namespace ranges
|
|||
auto __last = ranges::end(__r);
|
||||
__glibcxx_assert(__first != __last);
|
||||
auto __comp_proj = __detail::__make_comp_proj(__comp, __proj);
|
||||
minmax_result<range_value_t<_Range>> __result = {*__first, *__first};
|
||||
minmax_result<range_value_t<_Range>> __result = {*__first, __result.min};
|
||||
if (++__first == __last)
|
||||
return __result;
|
||||
else
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
|
||||
#include <algorithm>
|
||||
#include <string>
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
#include <testsuite_hooks.h>
|
||||
#include <testsuite_iterators.h>
|
||||
|
@ -129,6 +130,34 @@ test05()
|
|||
VERIFY( result.min == "a"s && result.max == "c"s );
|
||||
}
|
||||
|
||||
struct A {
|
||||
A() = delete;
|
||||
A(int i) : i(i) { }
|
||||
A(const A&) = default;
|
||||
A(A&& other) : A(std::as_const(other)) { ++move_count; }
|
||||
A& operator=(const A&) = default;
|
||||
A& operator=(A&& other) {
|
||||
++move_count;
|
||||
return *this = std::as_const(other);
|
||||
};
|
||||
friend auto operator<=>(const A&, const A&) = default;
|
||||
static inline int move_count = 0;
|
||||
int i;
|
||||
};
|
||||
|
||||
void
|
||||
test06()
|
||||
{
|
||||
// PR libstdc++/104858
|
||||
// Verify ranges::minmax doesn't dereference the iterator for the first
|
||||
// element in the range twice.
|
||||
A a(42);
|
||||
ranges::subrange r = {std::move_iterator(&a), std::move_sentinel(&a + 1)};
|
||||
auto result = ranges::minmax(r);
|
||||
VERIFY( A::move_count == 1 );
|
||||
VERIFY( result.min.i == 42 && result.max.i == 42 );
|
||||
}
|
||||
|
||||
int
|
||||
main()
|
||||
{
|
||||
|
@ -137,4 +166,5 @@ main()
|
|||
test03();
|
||||
test04();
|
||||
test05();
|
||||
test06();
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue