[PATCH] libstdc++: LWG 3301 transform_view::iterator has incorrect iterator_category
Patrick Palka
ppalka@redhat.com
Tue Feb 25 18:16:00 GMT 2020
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.
More information about the Libstdc++
mailing list