Skip to content

Commit d78c4aa

Browse files
committed
use valid_range_exclusive for correct overflow handling
1 parent 6fd909b commit d78c4aa

File tree

1 file changed

+7
-4
lines changed

1 file changed

+7
-4
lines changed

src/librustc_target/abi/mod.rs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1051,17 +1051,20 @@ impl<'a, Ty> TyLayout<'a, Ty> {
10511051
where
10521052
Self: Copy,
10531053
Ty: TyLayoutMethods<'a, C>,
1054-
C: LayoutOf<Ty = Ty, TyLayout: MaybeResult<Self, Error = E>>
1054+
C: LayoutOf<Ty = Ty, TyLayout: MaybeResult<Self, Error = E>> + HasDataLayout
10551055
{
10561056
let scalar_allows_raw_init = move |s: &Scalar| -> bool {
1057-
let range = &s.valid_range;
10581057
if zero {
1058+
let range = &s.valid_range;
10591059
// The range must contain 0.
10601060
range.contains(&0) ||
10611061
(*range.start() > *range.end()) // wrap-around allows 0
10621062
} else {
1063-
// The range must include all values.
1064-
*range.start() == range.end().wrapping_add(1)
1063+
// The range must include all values. `valid_range_exclusive` handles
1064+
// the wrap-around using target arithmetic; with wrap-around then the full
1065+
// range is one where `start == end`.
1066+
let range = s.valid_range_exclusive(cx);
1067+
range.start == range.end
10651068
}
10661069
};
10671070

0 commit comments

Comments
 (0)