summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Krüger <matthias.krueger@famsik.de>2024-09-29 20:17:37 +0200
committerGitHub <noreply@github.com>2024-09-29 20:17:37 +0200
commita0ae32d6a257c3756e934cd82e1e78158859eab5 (patch)
treeaf02eaa72810b5d4325bf422a993e4ad1ed33322
parenta061e566a6f3baf831c7785ad31f03f6f2a0d7a0 (diff)
parent7eedb6846cb76f76738c4ba51095a9742cb3ffd3 (diff)
Rollup merge of #130990 - RalfJung:mir-const-normalize, r=compiler-errors
try to get rid of mir::Const::normalize It was easy to make this compile, let's see if anything breaks... r? `@compiler-errors`
-rw-r--r--compiler/rustc_middle/src/mir/consts.rs16
-rw-r--r--compiler/rustc_mir_build/src/thir/cx/expr.rs18
-rw-r--r--compiler/rustc_mir_transform/src/jump_threading.rs4
-rw-r--r--tests/ui/asm/const-error.rs6
-rw-r--r--tests/ui/asm/const-error.stderr9
5 files changed, 14 insertions, 39 deletions
diff --git a/compiler/rustc_middle/src/mir/consts.rs b/compiler/rustc_middle/src/mir/consts.rs
index 89d4c460160..b34f5b48b78 100644
--- a/compiler/rustc_middle/src/mir/consts.rs
+++ b/compiler/rustc_middle/src/mir/consts.rs
@@ -221,7 +221,9 @@ pub enum Const<'tcx> {
}
impl<'tcx> Const<'tcx> {
- pub fn identity_unevaluated(
+ /// Creates an unevaluated const from a `DefId` for a const item.
+ /// The binders of the const item still need to be instantiated.
+ pub fn from_unevaluated(
tcx: TyCtxt<'tcx>,
def_id: DefId,
) -> ty::EarlyBinder<'tcx, Const<'tcx>> {
@@ -329,18 +331,6 @@ impl<'tcx> Const<'tcx> {
}
}
- /// Normalizes the constant to a value or an error if possible.
- #[inline]
- pub fn normalize(self, tcx: TyCtxt<'tcx>, param_env: ty::ParamEnv<'tcx>) -> Self {
- match self.eval(tcx, param_env, DUMMY_SP) {
- Ok(val) => Self::Val(val, self.ty()),
- Err(ErrorHandled::Reported(guar, _span)) => {
- Self::Ty(Ty::new_error(tcx, guar.into()), ty::Const::new_error(tcx, guar.into()))
- }
- Err(ErrorHandled::TooGeneric(_span)) => self,
- }
- }
-
#[inline]
pub fn try_eval_scalar(
self,
diff --git a/compiler/rustc_mir_build/src/thir/cx/expr.rs b/compiler/rustc_mir_build/src/thir/cx/expr.rs
index fbd45f59a4f..2ffad0b4834 100644
--- a/compiler/rustc_mir_build/src/thir/cx/expr.rs
+++ b/compiler/rustc_mir_build/src/thir/cx/expr.rs
@@ -699,23 +699,17 @@ impl<'tcx> Cx<'tcx> {
}
}
hir::InlineAsmOperand::Const { ref anon_const } => {
- let value = mir::Const::identity_unevaluated(
- tcx,
- anon_const.def_id.to_def_id(),
- )
- .instantiate_identity()
- .normalize(tcx, self.param_env);
+ let value =
+ mir::Const::from_unevaluated(tcx, anon_const.def_id.to_def_id())
+ .instantiate_identity();
let span = tcx.def_span(anon_const.def_id);
InlineAsmOperand::Const { value, span }
}
hir::InlineAsmOperand::SymFn { ref anon_const } => {
- let value = mir::Const::identity_unevaluated(
- tcx,
- anon_const.def_id.to_def_id(),
- )
- .instantiate_identity()
- .normalize(tcx, self.param_env);
+ let value =
+ mir::Const::from_unevaluated(tcx, anon_const.def_id.to_def_id())
+ .instantiate_identity();
let span = tcx.def_span(anon_const.def_id);
InlineAsmOperand::SymFn { value, span }
diff --git a/compiler/rustc_mir_transform/src/jump_threading.rs b/compiler/rustc_mir_transform/src/jump_threading.rs
index 9d85b5ba5a7..91fbc91e1e7 100644
--- a/compiler/rustc_mir_transform/src/jump_threading.rs
+++ b/compiler/rustc_mir_transform/src/jump_threading.rs
@@ -516,9 +516,7 @@ impl<'a, 'tcx> TOFinder<'a, 'tcx> {
// Avoid handling them, though this could be extended in the future.
return;
}
- let Some(value) =
- value.const_.normalize(self.tcx, self.param_env).try_to_scalar_int()
- else {
+ let Some(value) = value.const_.try_eval_scalar_int(self.tcx, self.param_env) else {
return;
};
let conds = conditions.map(self.arena, |c| Condition {
diff --git a/tests/ui/asm/const-error.rs b/tests/ui/asm/const-error.rs
index 40d0590c33e..8c722906284 100644
--- a/tests/ui/asm/const-error.rs
+++ b/tests/ui/asm/const-error.rs
@@ -1,14 +1,16 @@
//@ only-x86_64
//@ needs-asm-support
+//@ check-pass
-// Test to make sure that we emit const errors eagerly for inline asm
+// Test to make sure that we emit const errors late for inline asm,
+// which is consistent with inline const blocks.
use std::arch::asm;
fn test<T>() {
unsafe {
+ // No error here, as this does not get monomorphized.
asm!("/* {} */", const 1 / 0);
- //~^ ERROR evaluation of
}
}
diff --git a/tests/ui/asm/const-error.stderr b/tests/ui/asm/const-error.stderr
deleted file mode 100644
index 02e54457e89..00000000000
--- a/tests/ui/asm/const-error.stderr
+++ /dev/null
@@ -1,9 +0,0 @@
-error[E0080]: evaluation of `test::<T>::{constant#0}` failed
- --> $DIR/const-error.rs:10:32
- |
-LL | asm!("/* {} */", const 1 / 0);
- | ^^^^^ attempt to divide `1_i32` by zero
-
-error: aborting due to 1 previous error
-
-For more information about this error, try `rustc --explain E0080`.