Skip to content

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

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

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

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