diff options
| author | Ralf Jung <post@ralfj.de> | 2019-11-09 12:19:44 +0100 |
|---|---|---|
| committer | Ralf Jung <post@ralfj.de> | 2020-02-29 09:27:25 +0100 |
| commit | d78c4aa62ec0382d85e88b44cce2c087c5357f53 (patch) | |
| tree | beb7c57b47e0bcafef01c34877b4dad7a358faff | |
| parent | 6fd909b2b1dd2789e0f1af79283c6105fa502ca3 (diff) | |
| download | rust-d78c4aa62ec0382d85e88b44cce2c087c5357f53.tar.gz rust-d78c4aa62ec0382d85e88b44cce2c087c5357f53.zip | |
use valid_range_exclusive for correct overflow handling
| -rw-r--r-- | src/librustc_target/abi/mod.rs | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/src/librustc_target/abi/mod.rs b/src/librustc_target/abi/mod.rs index 4e4ef469090..c48e7de6b04 100644 --- a/src/librustc_target/abi/mod.rs +++ b/src/librustc_target/abi/mod.rs @@ -1051,17 +1051,20 @@ impl<'a, Ty> TyLayout<'a, Ty> { where Self: Copy, Ty: TyLayoutMethods<'a, C>, - C: LayoutOf<Ty = Ty, TyLayout: MaybeResult<Self, Error = E>> + C: LayoutOf<Ty = Ty, TyLayout: MaybeResult<Self, Error = E>> + HasDataLayout { let scalar_allows_raw_init = move |s: &Scalar| -> bool { - let range = &s.valid_range; if zero { + let range = &s.valid_range; // The range must contain 0. range.contains(&0) || (*range.start() > *range.end()) // wrap-around allows 0 } else { - // The range must include all values. - *range.start() == range.end().wrapping_add(1) + // The range must include all values. `valid_range_exclusive` handles + // the wrap-around using target arithmetic; with wrap-around then the full + // range is one where `start == end`. + let range = s.valid_range_exclusive(cx); + range.start == range.end } }; |
