diff options
| author | Matthias Krüger <matthias.krueger@famsik.de> | 2024-03-14 11:10:00 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-03-14 11:10:00 +0100 |
| commit | 75dc99b9963a3553e515f9c5da50eb19fbcdaba4 (patch) | |
| tree | 252a834a19d085b785f510b96397c14d0863808b /library/core/tests/iter/range.rs | |
| parent | bdf84ea00ec8f81adb0857fe39df34be045daca2 (diff) | |
| parent | d3cab9f4d6c778da99185a4548ef7f0899f04766 (diff) | |
| download | rust-75dc99b9963a3553e515f9c5da50eb19fbcdaba4.tar.gz rust-75dc99b9963a3553e515f9c5da50eb19fbcdaba4.zip | |
Rollup merge of #122461 - the8472:fix-step-forward-unchecked, r=Amanieu
fix unsoundness in Step::forward_unchecked for signed integers
Fixes #122420
```rust
pub fn foo(a: i8, b: u8) -> i8 {
unsafe { a.checked_add_unsigned(b).unwrap_unchecked() }
}
```
still compiles down to a single arithmetic instruction ([godbolt](https://rust.godbolt.org/z/qsd3xYWfE)).
But we may be losing some loop optimizations if llvm can no longer easily derive that it's a finite counted loop from the no-wrapping flags.
Diffstat (limited to 'library/core/tests/iter/range.rs')
| -rw-r--r-- | library/core/tests/iter/range.rs | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/library/core/tests/iter/range.rs b/library/core/tests/iter/range.rs index 9af07119a89..e31db0732e0 100644 --- a/library/core/tests/iter/range.rs +++ b/library/core/tests/iter/range.rs @@ -325,6 +325,11 @@ fn test_range_advance_by() { assert_eq!(Ok(()), r.advance_back_by(usize::MAX)); assert_eq!((r.start, r.end), (0u128 + usize::MAX as u128, u128::MAX - usize::MAX as u128)); + + // issue 122420, Step::forward_unchecked was unsound for signed integers + let mut r = -128i8..127; + assert_eq!(Ok(()), r.advance_by(200)); + assert_eq!(r.next(), Some(72)); } #[test] |
