On Tue, 25 Feb 2020, Jonathan Wakely wrote: > On 24/02/20 18:39 -0500, Patrick Palka wrote: > > On Mon, 24 Feb 2020, Patrick Palka wrote: > > > > > libstdc++-v3/ChangeLog: > > > > > > LWG 3301 transform_view::_Iterator has incorrect iterator_category > > > * include/std/ranges (transform_view::_Iterator::_S_iter_cat): Adjust > > > determination of iterator_category as per LWG 3301. > > > * testsuite/std/ranges/adaptors/transform.cc: Augment test. > > > --- > > > libstdc++-v3/include/std/ranges | 16 +++++++++---- > > > .../std/ranges/adaptors/transform.cc | 24 +++++++++++++++++++ > > > 2 files changed, 35 insertions(+), 5 deletions(-) > > > > > > diff --git a/libstdc++-v3/include/std/ranges > > > b/libstdc++-v3/include/std/ranges > > > index ab8fbaca38f..aed90e9710e 100644 > > > --- a/libstdc++-v3/include/std/ranges > > > +++ b/libstdc++-v3/include/std/ranges > > > @@ -1570,12 +1570,18 @@ namespace views > > > static constexpr auto > > > _S_iter_cat() > > > { > > > - using _Cat > > > - = typename iterator_traits<_Base_iter>::iterator_category; > > > - if constexpr (derived_from<_Cat, contiguous_iterator_tag>) > > > - return random_access_iterator_tag{}; > > > + using _Res = invoke_result_t<_Fp&, range_reference_t<_Base>>; > > > > Consider this line fixed to use 'typename'. > > > > > + if constexpr (is_lvalue_reference_v<_Res>) > > > + { > > > + using _Cat > > > + = typename iterator_traits<_Base_iter>::iterator_category; > > > + if constexpr (derived_from<_Cat, contiguous_iterator_tag>) > > > + return random_access_iterator_tag{}; > > > + else > > > + return _Cat{}; > > > + } > > > else > > > - return _Cat{}; > > > + return input_iterator_tag{}; > > > } > > > > > > static constexpr decltype(auto) > > > diff --git a/libstdc++-v3/testsuite/std/ranges/adaptors/transform.cc > > > b/libstdc++-v3/testsuite/std/ranges/adaptors/transform.cc > > > index ad51fffb43d..0845febe2cf 100644 > > > --- a/libstdc++-v3/testsuite/std/ranges/adaptors/transform.cc > > > +++ b/libstdc++-v3/testsuite/std/ranges/adaptors/transform.cc > > > @@ -77,10 +77,34 @@ test03() > > > VERIFY( ranges::equal(v, (int[]){1,2,3,4,5}) ); > > > } > > > > > > +void > > > +test04() > > > +{ > > > + // LWG 3302 > > > > Consider this comment fixed to say 3301. > > OK, thanks.
Thanks for the review, I just committed all five patches.