aboutsummaryrefslogtreecommitdiff
path: root/gcc/ada/libgnat/a-stwisu.adb
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely@redhat.com>2025-07-14 11:21:24 +0100
committerJonathan Wakely <redi@gcc.gnu.org>2025-07-15 20:31:47 +0100
commit72d9ed607f4c4a1dd29331b8c80805c6485f61ed (patch)
tree7c781fa7603afc0281c15a730ad09aea92a9fd36 /gcc/ada/libgnat/a-stwisu.adb
parent0828600f586e75a2056a4fc7eb0a340c363d6c66 (diff)
downloadgcc-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