diff options
author | Jonathan Wakely <jwakely@redhat.com> | 2025-07-14 11:21:24 +0100 |
---|---|---|
committer | Jonathan Wakely <redi@gcc.gnu.org> | 2025-07-15 20:31:47 +0100 |
commit | 72d9ed607f4c4a1dd29331b8c80805c6485f61ed (patch) | |
tree | 7c781fa7603afc0281c15a730ad09aea92a9fd36 /gcc/ada/libgnat/a-stwisu.adb | |
parent | 0828600f586e75a2056a4fc7eb0a340c363d6c66 (diff) | |
download | gcc-72d9ed607f4c4a1dd29331b8c80805c6485f61ed.zip gcc-72d9ed607f4c4a1dd29331b8c80805c6485f61ed.tar.gz gcc-72d9ed607f4c4a1dd29331b8c80805c6485f61ed.tar.bz2 |
libstdc++: Make ranges::advance(it, n, bound) follow standard more strictly
The standard specifies some of the effects of ranges::advance in terms
of "Equivalent to:" and it's observable that our current implementation
deviates from the precise specification in the standard. This was
causing some failures in the libc++ testsuite.
For the sized_sentinel_for<I, S> case I optimized our implementation to
avoid redundant calls when we have already checked that there's nothing
to do. We were eliding `advance(i, bound)` when the iterator already
equals the sentinel, and eliding `advance(i, n)` when `n` is zero. In
both cases, removing the seemingly redundant calls is not equivalent to
the spec because `i = std::move(bound)` or `i += 0` operations can be
observed by program-defined iterators. This patch inlines the observable
side effects of advance(i, bound) or advance(i, 0) without actually
calling those functions.
For the non-sized sentinel case, `if (i == bound || n == 0)` is
different from `if (n == 0 || i == bound)` for the case where n is zero
and a program-defined iterator observes the number of comparisons.
This patch changes it to do `n == 0` first. I don't think this is
required by the standard, as this condition is not "Equivalent to:" any
observable sequence of operations, but testing `n == 0` first is
probably cheaper anyway.
libstdc++-v3/ChangeLog:
* include/bits/ranges_base.h (ranges::advance(i, n, bound)):
Ensure that observable side effects on iterators match what is
specified in the standard.
Reviewed-by: Tomasz KamiĆski <tkaminsk@redhat.com>
Diffstat (limited to 'gcc/ada/libgnat/a-stwisu.adb')
0 files changed, 0 insertions, 0 deletions