Auto merge of #121571 - clarfonthey:unchecked-math-preconditions, r=s… · model-checking/verify-rust-std@23bb5bc (original) (raw)
`@@ -488,9 +488,19 @@ macro_rules! int_impl {
`
488
488
` #[inline(always)]
`
489
489
` #[cfg_attr(miri, track_caller)] // even without panics, this helps for Miri backtraces
`
490
490
`pub const unsafe fn unchecked_add(self, rhs: Self) -> Self {
`
491
``
`-
// SAFETY: the caller must uphold the safety contract for
`
492
``
`` -
// unchecked_add
.
``
493
``
`-
unsafe { intrinsics::unchecked_add(self, rhs) }
`
``
491
`+
assert_unsafe_precondition!(
`
``
492
`+
check_language_ub,
`
``
493
`+
concat!(stringify!($SelfT), "::unchecked_add cannot overflow"),
`
``
494
`+
(
`
``
495
`+
lhs: $SelfT = self,
`
``
496
`+
rhs: $SelfT = rhs,
`
``
497
`+
) => !lhs.overflowing_add(rhs).1,
`
``
498
`+
);
`
``
499
+
``
500
`+
// SAFETY: this is guaranteed to be safe by the caller.
`
``
501
`+
unsafe {
`
``
502
`+
intrinsics::unchecked_add(self, rhs)
`
``
503
`+
}
`
494
504
`}
`
495
505
``
496
506
`` /// Checked addition with an unsigned integer. Computes self + rhs
,
``
`@@ -630,9 +640,19 @@ macro_rules! int_impl {
`
630
640
` #[inline(always)]
`
631
641
` #[cfg_attr(miri, track_caller)] // even without panics, this helps for Miri backtraces
`
632
642
`pub const unsafe fn unchecked_sub(self, rhs: Self) -> Self {
`
633
``
`-
// SAFETY: the caller must uphold the safety contract for
`
634
``
`` -
// unchecked_sub
.
``
635
``
`-
unsafe { intrinsics::unchecked_sub(self, rhs) }
`
``
643
`+
assert_unsafe_precondition!(
`
``
644
`+
check_language_ub,
`
``
645
`+
concat!(stringify!($SelfT), "::unchecked_sub cannot overflow"),
`
``
646
`+
(
`
``
647
`+
lhs: $SelfT = self,
`
``
648
`+
rhs: $SelfT = rhs,
`
``
649
`+
) => !lhs.overflowing_sub(rhs).1,
`
``
650
`+
);
`
``
651
+
``
652
`+
// SAFETY: this is guaranteed to be safe by the caller.
`
``
653
`+
unsafe {
`
``
654
`+
intrinsics::unchecked_sub(self, rhs)
`
``
655
`+
}
`
636
656
`}
`
637
657
``
638
658
`` /// Checked subtraction with an unsigned integer. Computes self - rhs
,
``
`@@ -772,9 +792,19 @@ macro_rules! int_impl {
`
772
792
` #[inline(always)]
`
773
793
` #[cfg_attr(miri, track_caller)] // even without panics, this helps for Miri backtraces
`
774
794
`pub const unsafe fn unchecked_mul(self, rhs: Self) -> Self {
`
775
``
`-
// SAFETY: the caller must uphold the safety contract for
`
776
``
`` -
// unchecked_mul
.
``
777
``
`-
unsafe { intrinsics::unchecked_mul(self, rhs) }
`
``
795
`+
assert_unsafe_precondition!(
`
``
796
`+
check_language_ub,
`
``
797
`+
concat!(stringify!($SelfT), "::unchecked_mul cannot overflow"),
`
``
798
`+
(
`
``
799
`+
lhs: $SelfT = self,
`
``
800
`+
rhs: $SelfT = rhs,
`
``
801
`+
) => !lhs.overflowing_mul(rhs).1,
`
``
802
`+
);
`
``
803
+
``
804
`+
// SAFETY: this is guaranteed to be safe by the caller.
`
``
805
`+
unsafe {
`
``
806
`+
intrinsics::unchecked_mul(self, rhs)
`
``
807
`+
}
`
778
808
`}
`
779
809
``
780
810
`` /// Checked integer division. Computes self / rhs
, returning None
if rhs == 0
``
`@@ -1111,9 +1141,22 @@ macro_rules! int_impl {
`
1111
1141
` #[inline(always)]
`
1112
1142
` #[cfg_attr(miri, track_caller)] // even without panics, this helps for Miri backtraces
`
1113
1143
`pub const unsafe fn unchecked_neg(self) -> Self {
`
1114
``
`-
// SAFETY: the caller must uphold the safety contract for
`
1115
``
`` -
// unchecked_neg
.
``
1116
``
`-
unsafe { intrinsics::unchecked_sub(0, self) }
`
``
1144
`+
// ICE resolved by #125184 isn't in bootstrap compiler
`
``
1145
`+
#[cfg(not(bootstrap))]
`
``
1146
`+
{
`
``
1147
`+
assert_unsafe_precondition!(
`
``
1148
`+
check_language_ub,
`
``
1149
`+
concat!(stringify!($SelfT), "::unchecked_neg cannot overflow"),
`
``
1150
`+
(
`
``
1151
`+
lhs: $SelfT = self,
`
``
1152
`+
) => !lhs.overflowing_neg().1,
`
``
1153
`+
);
`
``
1154
`+
}
`
``
1155
+
``
1156
`+
// SAFETY: this is guaranteed to be safe by the caller.
`
``
1157
`+
unsafe {
`
``
1158
`+
intrinsics::unchecked_sub(0, self)
`
``
1159
`+
}
`
1117
1160
`}
`
1118
1161
``
1119
1162
`` /// Strict negation. Computes -self
, panicking if self == MIN
.
``
`@@ -1234,9 +1277,19 @@ macro_rules! int_impl {
`
1234
1277
` #[inline(always)]
`
1235
1278
` #[cfg_attr(miri, track_caller)] // even without panics, this helps for Miri backtraces
`
1236
1279
`pub const unsafe fn unchecked_shl(self, rhs: u32) -> Self {
`
1237
``
`-
// SAFETY: the caller must uphold the safety contract for
`
1238
``
`` -
// unchecked_shl
.
``
1239
``
`-
unsafe { intrinsics::unchecked_shl(self, rhs) }
`
``
1280
`+
assert_unsafe_precondition!(
`
``
1281
`+
check_language_ub,
`
``
1282
`+
concat!(stringify!($SelfT), "::unchecked_shl cannot overflow"),
`
``
1283
`+
(
`
``
1284
`+
rhs: u32 = rhs,
`
``
1285
`+
bits: u32 = Self::BITS,
`
``
1286
`+
) => rhs < bits,
`
``
1287
`+
);
`
``
1288
+
``
1289
`+
// SAFETY: this is guaranteed to be safe by the caller.
`
``
1290
`+
unsafe {
`
``
1291
`+
intrinsics::unchecked_shl(self, rhs)
`
``
1292
`+
}
`
1240
1293
`}
`
1241
1294
``
1242
1295
`` /// Checked shift right. Computes self >> rhs
, returning None
if rhs
is
``
`@@ -1323,9 +1376,19 @@ macro_rules! int_impl {
`
1323
1376
` #[inline(always)]
`
1324
1377
` #[cfg_attr(miri, track_caller)] // even without panics, this helps for Miri backtraces
`
1325
1378
`pub const unsafe fn unchecked_shr(self, rhs: u32) -> Self {
`
1326
``
`-
// SAFETY: the caller must uphold the safety contract for
`
1327
``
`` -
// unchecked_shr
.
``
1328
``
`-
unsafe { intrinsics::unchecked_shr(self, rhs) }
`
``
1379
`+
assert_unsafe_precondition!(
`
``
1380
`+
check_language_ub,
`
``
1381
`+
concat!(stringify!($SelfT), "::unchecked_shr cannot overflow"),
`
``
1382
`+
(
`
``
1383
`+
rhs: u32 = rhs,
`
``
1384
`+
bits: u32 = Self::BITS,
`
``
1385
`+
) => rhs < bits,
`
``
1386
`+
);
`
``
1387
+
``
1388
`+
// SAFETY: this is guaranteed to be safe by the caller.
`
``
1389
`+
unsafe {
`
``
1390
`+
intrinsics::unchecked_shr(self, rhs)
`
``
1391
`+
}
`
1329
1392
`}
`
1330
1393
``
1331
1394
`` /// Checked absolute value. Computes self.abs()
, returning None
if
``