On Tue, Jul 15, 2025 at 9:51 PM Patrick Palka <ppa...@redhat.com> wrote:
> Tested on x86_64-pc-linux-gnu, does this look OK for trunk? > > -- >8 -- > > The offset-based partial specialization of _CachedPosition for > random-access iterators is currently only selected if the offset type is > smaller than the iterator type. Before r12-1018-g46ed811bcb4b86 this > made sense since the main partial specialization only stored the > iterator (incorrectly). After that bugfix, the main partial > specialization now effectively stores a std::optional<iter>, so the > size constraint is inaccurate, optional<Iterator> is still smaller than 2 * sizeof(Iterator), so the constraints could be updated to range::difference <= 2 * sizeof(Iterator) or <= sizeof(non_propagating_cache). However, having a range::difference_t being larger than iterator, should be unusual, as the iterator must be able to represent as many positions as the difference type. So except for cases like repeat, they should be similar size. I do not think it is worth optimizing for that. I think it is easier for users if the caching rules are simplified, and does not depend on size. and it must invalidate itself upon > copy/move unlike the offset-based partial specialization. So I think > we should just always prefer the offset-based _CachedPosition for a > random-access iterator, even if the offset type happens to be larger > than the iterator type. > > libstdc++-v3/ChangeLog: > > * include/std/ranges (__detail::_CachedPosition): Remove > additional size constraint on the offset-based partial > specialization. > --- > Given the above LGTM. > libstdc++-v3/include/std/ranges | 2 -- > 1 file changed, 2 deletions(-) > > diff --git a/libstdc++-v3/include/std/ranges > b/libstdc++-v3/include/std/ranges > index efe62969d657..2970b2cbe00b 100644 > --- a/libstdc++-v3/include/std/ranges > +++ b/libstdc++-v3/include/std/ranges > @@ -1585,8 +1585,6 @@ namespace views::__adaptor > }; > > template<random_access_range _Range> > - requires (sizeof(range_difference_t<_Range>) > - <= sizeof(iterator_t<_Range>)) > struct _CachedPosition<_Range> > { > private: > -- > 2.50.1.271.gd30e120486 > >