about summary refs log tree commit diff
path: root/library/core/src
diff options
context:
space:
mode:
authorScott McMurray <scottmcm@users.noreply.github.com>2023-06-16 15:21:34 -0700
committerScott McMurray <scottmcm@users.noreply.github.com>2023-06-16 16:03:19 -0700
commit3ec4eeddefcf022af3aafab708d36830f40d8a47 (patch)
treed315d11dfcd3acad6673f5ad2d66e098aea45fab /library/core/src
parent6bba061467f7c2cab04b262b95eb67bf89265587 (diff)
downloadrust-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.rs17
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
     }};
 }