Thanks to visit codestin.com
Credit goes to github.com

Skip to content

<algorithm>: ranges::minmax accidentally constructed remove_cvref_t<iter_reference_t<I>> #4102

@hewillk

Description

@hewillk

STL/stl/inc/algorithm

Lines 10108 to 10116 in 1c59a20

using _Vty = range_value_t<_Rng>;
// This initialization is correct, similar to the N4950 [dcl.init.aggr]/6 example
minmax_result<_Vty> _Found = {static_cast<_Vty>(*_UFirst), _Found.min};
if (_UFirst == _ULast) {
return _Found;
}
while (++_UFirst != _ULast) { // process one or two elements
auto _Prev = *_UFirst;

The last auto _Prev = *_UFirst; indicates that we constructed remove_cvref_t<iter_reference_t<I>> from iter_reference_t<I>, which is not guaranteed to be well-formed by the function's constraints.
I believe we should do _Vty _Prev(*_UFirst); instead.

Contrived testcase: https://godbolt.org/z/Gdb8qffdM

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingfixedSomething works now, yay!rangesC++20/23 ranges

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions