about summary refs log tree commit diff
path: root/compiler/rustc_mir_transform/src/required_consts.rs
diff options
context:
space:
mode:
authorRalf Jung <post@ralfj.de>2024-03-14 07:28:25 +0100
committerRalf Jung <post@ralfj.de>2024-04-23 22:52:44 +0200
commitbf021ea6258bcd886fae523e8448f3697dd041fe (patch)
tree56a2db07f08c28f7614aef7b204a4114451172ab /compiler/rustc_mir_transform/src/required_consts.rs
parentb2b617a88e477ca6511790cd58c9409e23eac1f5 (diff)
downloadrust-bf021ea6258bcd886fae523e8448f3697dd041fe.tar.gz
rust-bf021ea6258bcd886fae523e8448f3697dd041fe.zip
interpret: sanity-check that required_consts captures all consts that can fail
Diffstat (limited to 'compiler/rustc_mir_transform/src/required_consts.rs')
-rw-r--r--compiler/rustc_mir_transform/src/required_consts.rs22
1 files changed, 15 insertions, 7 deletions
diff --git a/compiler/rustc_mir_transform/src/required_consts.rs b/compiler/rustc_mir_transform/src/required_consts.rs
index abde6a47e83..f0c63a6648c 100644
--- a/compiler/rustc_mir_transform/src/required_consts.rs
+++ b/compiler/rustc_mir_transform/src/required_consts.rs
@@ -1,6 +1,6 @@
 use rustc_middle::mir::visit::Visitor;
 use rustc_middle::mir::{Const, ConstOperand, Location};
-use rustc_middle::ty::ConstKind;
+use rustc_middle::ty;
 
 pub struct RequiredConstsVisitor<'a, 'tcx> {
     required_consts: &'a mut Vec<ConstOperand<'tcx>>,
@@ -14,14 +14,22 @@ impl<'a, 'tcx> RequiredConstsVisitor<'a, 'tcx> {
 
 impl<'tcx> Visitor<'tcx> for RequiredConstsVisitor<'_, 'tcx> {
     fn visit_constant(&mut self, constant: &ConstOperand<'tcx>, _: Location) {
-        let const_ = constant.const_;
-        match const_ {
+        // Only unevaluated consts have to be added to `required_consts` as only those can possibly
+        // still have latent const-eval errors.
+        let is_required = match constant.const_ {
             Const::Ty(c) => match c.kind() {
-                ConstKind::Param(_) | ConstKind::Error(_) | ConstKind::Value(_) => {}
-                _ => bug!("only ConstKind::Param/Value should be encountered here, got {:#?}", c),
+                ty::ConstKind::Value(_) => false, // already a value, cannot error
+                ty::ConstKind::Param(_) | ty::ConstKind::Error(_) => true, // these are errors or could be replaced by errors
+                _ => bug!(
+                    "only ConstKind::Param/Value/Error should be encountered here, got {:#?}",
+                    c
+                ),
             },
-            Const::Unevaluated(..) => self.required_consts.push(*constant),
-            Const::Val(..) => {}
+            Const::Unevaluated(..) => true,
+            Const::Val(..) => false, // already a value, cannot error
+        };
+        if is_required {
+            self.required_consts.push(*constant);
         }
     }
 }