diff options
| author | Scott McMurray <scottmcm@users.noreply.github.com> | 2023-06-16 15:21:34 -0700 |
|---|---|---|
| committer | Scott McMurray <scottmcm@users.noreply.github.com> | 2023-06-16 16:03:19 -0700 |
| commit | 3ec4eeddefcf022af3aafab708d36830f40d8a47 (patch) | |
| tree | d315d11dfcd3acad6673f5ad2d66e098aea45fab /library/core/src | |
| parent | 6bba061467f7c2cab04b262b95eb67bf89265587 (diff) | |
| download | rust-3ec4eeddefcf022af3aafab708d36830f40d8a47.tar.gz rust-3ec4eeddefcf022af3aafab708d36830f40d8a47.zip | |
[libs] Simplify `unchecked_{shl,shr}`
There's no need for the `const_eval_select` dance here. And while I originally wrote the `.try_into().unwrap_unchecked()` implementation here, it's kinda a mess in MIR -- this new one is substantially simpler, as shown by the old one being above the inlining threshold but the new one being below it.
Diffstat (limited to 'library/core/src')
| -rw-r--r-- | library/core/src/num/mod.rs | 17 |
1 files changed, 5 insertions, 12 deletions
diff --git a/library/core/src/num/mod.rs b/library/core/src/num/mod.rs index c9baa09f407..95dcaf5dd73 100644 --- a/library/core/src/num/mod.rs +++ b/library/core/src/num/mod.rs @@ -3,7 +3,6 @@ #![stable(feature = "rust1", since = "1.0.0")] use crate::ascii; -use crate::convert::TryInto; use crate::intrinsics; use crate::mem; use crate::ops::{Add, Mul, Sub}; @@ -278,18 +277,12 @@ macro_rules! widening_impl { macro_rules! conv_rhs_for_unchecked_shift { ($SelfT:ty, $x:expr) => {{ - #[inline] - fn conv(x: u32) -> $SelfT { - // FIXME(const-hack) replace with `.try_into().ok().unwrap_unchecked()`. - // SAFETY: Any legal shift amount must be losslessly representable in the self type. - unsafe { x.try_into().ok().unwrap_unchecked() } - } - #[inline] - const fn const_conv(x: u32) -> $SelfT { - x as _ + // If the `as` cast will truncate, ensure we still tell the backend + // that the pre-truncation value was also small. + if <$SelfT>::BITS < 32 { + intrinsics::assume($x <= (<$SelfT>::MAX as u32)); } - - intrinsics::const_eval_select(($x,), const_conv, conv) + $x as $SelfT }}; } |
