about summary refs log tree commit diff
path: root/compiler
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2025-02-05 15:10:28 +0000
committerbors <bors@rust-lang.org>2025-02-05 15:10:28 +0000
commitd4bdd1ed551fed0c951eb47b4be2c79d7a02d181 (patch)
tree7a8d867f2123aa91a21f0881cc17a40d3a8ae5b6 /compiler
parent820bfffc25fee9866aa8176529091e04b8824f09 (diff)
parent0cd51863ff1d92a904bec6fc854fbf201fb52bdd (diff)
downloadrust-d4bdd1ed551fed0c951eb47b4be2c79d7a02d181.tar.gz
rust-d4bdd1ed551fed0c951eb47b4be2c79d7a02d181.zip
Auto merge of #136302 - oli-obk:push-vvqmwzunxsrk, r=compiler-errors
Avoid calling the layout_of query in lit_to_const

We got all the information available locally
Diffstat (limited to 'compiler')
-rw-r--r--compiler/rustc_mir_build/src/builder/expr/as_constant.rs21
-rw-r--r--compiler/rustc_mir_build/src/thir/constant.rs28
2 files changed, 28 insertions, 21 deletions
diff --git a/compiler/rustc_mir_build/src/builder/expr/as_constant.rs b/compiler/rustc_mir_build/src/builder/expr/as_constant.rs
index e4e452aff75..84c9297e658 100644
--- a/compiler/rustc_mir_build/src/builder/expr/as_constant.rs
+++ b/compiler/rustc_mir_build/src/builder/expr/as_constant.rs
@@ -105,13 +105,12 @@ fn lit_to_mir_constant<'tcx>(tcx: TyCtxt<'tcx>, lit_input: LitToConstInput<'tcx>
         return Const::Ty(Ty::new_error(tcx, guar), ty::Const::new_error(tcx, guar));
     }
 
-    let trunc = |n| {
-        let width = match tcx.layout_of(ty::TypingEnv::fully_monomorphized().as_query_input(ty)) {
-            Ok(layout) => layout.size,
-            Err(_) => {
-                tcx.dcx().bug(format!("couldn't compute width of literal: {:?}", lit_input.lit))
-            }
-        };
+    let trunc = |n, width: ty::UintTy| {
+        let width = width
+            .normalize(tcx.data_layout.pointer_size.bits().try_into().unwrap())
+            .bit_width()
+            .unwrap();
+        let width = Size::from_bits(width);
         trace!("trunc {} with size {} and shift {}", n, width.bits(), 128 - width.bits());
         let result = width.truncate(n);
         trace!("trunc result: {}", result);
@@ -145,9 +144,11 @@ fn lit_to_mir_constant<'tcx>(tcx: TyCtxt<'tcx>, lit_input: LitToConstInput<'tcx>
         (ast::LitKind::Byte(n), ty::Uint(ty::UintTy::U8)) => {
             ConstValue::Scalar(Scalar::from_uint(*n, Size::from_bytes(1)))
         }
-        (ast::LitKind::Int(n, _), ty::Uint(_)) | (ast::LitKind::Int(n, _), ty::Int(_)) => {
-            trunc(if neg { (n.get() as i128).overflowing_neg().0 as u128 } else { n.get() })
-        }
+        (ast::LitKind::Int(n, _), ty::Uint(ui)) if !neg => trunc(n.get(), *ui),
+        (ast::LitKind::Int(n, _), ty::Int(i)) => trunc(
+            if neg { (n.get() as i128).overflowing_neg().0 as u128 } else { n.get() },
+            i.to_unsigned(),
+        ),
         (ast::LitKind::Float(n, _), ty::Float(fty)) => {
             parse_float_into_constval(*n, *fty, neg).unwrap()
         }
diff --git a/compiler/rustc_mir_build/src/thir/constant.rs b/compiler/rustc_mir_build/src/thir/constant.rs
index 49db522cf0e..f303053390c 100644
--- a/compiler/rustc_mir_build/src/thir/constant.rs
+++ b/compiler/rustc_mir_build/src/thir/constant.rs
@@ -1,4 +1,5 @@
-use rustc_ast as ast;
+use rustc_abi::Size;
+use rustc_ast::{self as ast};
 use rustc_hir::LangItem;
 use rustc_middle::bug;
 use rustc_middle::mir::interpret::LitToConstInput;
@@ -17,13 +18,12 @@ pub(crate) fn lit_to_const<'tcx>(
         return ty::Const::new_error(tcx, guar);
     }
 
-    let trunc = |n| {
-        let width = match tcx.layout_of(ty::TypingEnv::fully_monomorphized().as_query_input(ty)) {
-            Ok(layout) => layout.size,
-            Err(_) => {
-                tcx.dcx().bug(format!("couldn't compute width of literal: {:?}", lit_input.lit))
-            }
-        };
+    let trunc = |n, width: ty::UintTy| {
+        let width = width
+            .normalize(tcx.data_layout.pointer_size.bits().try_into().unwrap())
+            .bit_width()
+            .unwrap();
+        let width = Size::from_bits(width);
         trace!("trunc {} with size {} and shift {}", n, width.bits(), 128 - width.bits());
         let result = width.truncate(n);
         trace!("trunc result: {}", result);
@@ -55,9 +55,15 @@ pub(crate) fn lit_to_const<'tcx>(
             let bytes = data as &[u8];
             ty::ValTree::from_raw_bytes(tcx, bytes)
         }
-        (ast::LitKind::Int(n, _), ty::Uint(_)) | (ast::LitKind::Int(n, _), ty::Int(_)) => {
-            let scalar_int =
-                trunc(if neg { (n.get() as i128).overflowing_neg().0 as u128 } else { n.get() });
+        (ast::LitKind::Int(n, _), ty::Uint(ui)) if !neg => {
+            let scalar_int = trunc(n.get(), *ui);
+            ty::ValTree::from_scalar_int(scalar_int)
+        }
+        (ast::LitKind::Int(n, _), ty::Int(i)) => {
+            let scalar_int = trunc(
+                if neg { (n.get() as i128).overflowing_neg().0 as u128 } else { n.get() },
+                i.to_unsigned(),
+            );
             ty::ValTree::from_scalar_int(scalar_int)
         }
         (ast::LitKind::Bool(b), ty::Bool) => ty::ValTree::from_scalar_int((*b).into()),