[libc++] Fix bug in ranges::advance
authorLouis Dionne <ldionne.2@gmail.com>
Thu, 13 Jan 2022 17:16:30 +0000 (12:16 -0500)
committerLouis Dionne <ldionne.2@gmail.com>
Thu, 27 Jan 2022 15:57:54 +0000 (10:57 -0500)
commitd27cbfa9d366c2f6620770f514f612aa1bb0ecb6
treebe0f43f919cdc8d47564e1e6e03a73ac548de71b
parent0902eb30ad714da3ed6c6a744337c9b52427f366
[libc++] Fix bug in ranges::advance

In `ranges::advance(iter, n, bound)`, we'd incorrectly handle the case
where bound < iter and n is 0:

    int a[10];
    int *p = a+5;
    int *bound = a+3;
    std::ranges::advance(p, 0, bound);
    assert(p - a == 5); // we'd return 3 before this patch

This was caused by an incorrect handling of 0 inside __magnitude_geq.

Differential Revision: https://reviews.llvm.org/D117240
libcxx/include/__iterator/advance.h
libcxx/test/std/iterators/iterator.primitives/range.iter.ops/range.iter.ops.advance/iterator_count_sentinel.pass.cpp
libcxx/test/std/iterators/iterator.primitives/range.iter.ops/range.iter.ops.prev/iterator_count_sentinel.pass.cpp