about summary refs log tree commit diff
diff options
context:
space:
mode:
authorRalf Jung <post@ralfj.de>2019-11-09 12:19:44 +0100
committerRalf Jung <post@ralfj.de>2020-02-29 09:27:25 +0100
commitd78c4aa62ec0382d85e88b44cce2c087c5357f53 (patch)
treebeb7c57b47e0bcafef01c34877b4dad7a358faff
parent6fd909b2b1dd2789e0f1af79283c6105fa502ca3 (diff)
downloadrust-d78c4aa62ec0382d85e88b44cce2c087c5357f53.tar.gz
rust-d78c4aa62ec0382d85e88b44cce2c087c5357f53.zip
use valid_range_exclusive for correct overflow handling
-rw-r--r--src/librustc_target/abi/mod.rs11
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
             }
         };