Skip to content

Commit 95abd71

Browse files
committed
use valid_range_exclusive for correct overflow handling
1 parent 53b7d92 commit 95abd71

File tree

1 file changed

+7
-4
lines changed

1 file changed

+7
-4
lines changed

src/librustc_target/abi/mod.rs

+7-4
Original file line numberDiff line numberDiff line change
@@ -1133,17 +1133,20 @@ impl<'a, Ty> TyLayout<'a, Ty> {
11331133
where
11341134
Self: Copy,
11351135
Ty: TyLayoutMethods<'a, C>,
1136-
C: LayoutOf<Ty = Ty, TyLayout: MaybeResult<Self, Error = E>>
1136+
C: LayoutOf<Ty = Ty, TyLayout: MaybeResult<Self, Error = E>> + HasDataLayout
11371137
{
11381138
let scalar_allows_raw_init = move |s: &Scalar| -> bool {
1139-
let range = &s.valid_range;
11401139
if zero {
1140+
let range = &s.valid_range;
11411141
// The range must contain 0.
11421142
range.contains(&0) ||
11431143
(*range.start() > *range.end()) // wrap-around allows 0
11441144
} else {
1145-
// The range must include all values.
1146-
*range.start() == range.end().wrapping_add(1)
1145+
// The range must include all values. `valid_range_exclusive` handles
1146+
// the wrap-around using target arithmetic; with wrap-around then the full
1147+
// range is one where `start == end`.
1148+
let range = s.valid_range_exclusive(cx);
1149+
range.start == range.end
11471150
}
11481151
};
11491152

0 commit comments

Comments
 (0)