diff options
| author | Ralf Jung <post@ralfj.de> | 2023-09-14 07:53:38 +0200 |
|---|---|---|
| committer | Ralf Jung <post@ralfj.de> | 2023-09-14 07:56:01 +0200 |
| commit | 19fb2c7ccd67c8599b5327efd0aab383f77d99a3 (patch) | |
| tree | dd650271c9a4fc09342a794e9a4b26b53ed7cc2d | |
| parent | 292d5bba86d2d04813be5b887cd86a98876e02ea (diff) | |
| download | rust-19fb2c7ccd67c8599b5327efd0aab383f77d99a3.tar.gz rust-19fb2c7ccd67c8599b5327efd0aab383f77d99a3.zip | |
found another place where we can eval() a const, and go through valtrees
| -rw-r--r-- | compiler/rustc_middle/src/mir/mod.rs | 6 | ||||
| -rw-r--r-- | compiler/rustc_middle/src/ty/consts/kind.rs | 5 | ||||
| -rw-r--r-- | compiler/rustc_monomorphize/src/collector.rs | 42 |
3 files changed, 14 insertions, 39 deletions
diff --git a/compiler/rustc_middle/src/mir/mod.rs b/compiler/rustc_middle/src/mir/mod.rs index 1ce7140f361..3ebb1038119 100644 --- a/compiler/rustc_middle/src/mir/mod.rs +++ b/compiler/rustc_middle/src/mir/mod.rs @@ -2297,7 +2297,11 @@ pub struct Constant<'tcx> { #[derive(Clone, Copy, PartialEq, Eq, TyEncodable, TyDecodable, Hash, HashStable, Debug)] #[derive(Lift, TypeFoldable, TypeVisitable)] pub enum ConstantKind<'tcx> { - /// This constant came from the type system + /// This constant came from the type system. + /// + /// Any way of turning `ty::Const` into `ConstValue` should go through `valtree_to_const_val`; + /// this ensures that we consistently produce "clean" values without data in the padding or + /// anything like that. Ty(ty::Const<'tcx>), /// An unevaluated mir constant which is not part of the type system. diff --git a/compiler/rustc_middle/src/ty/consts/kind.rs b/compiler/rustc_middle/src/ty/consts/kind.rs index a0a7331a37e..e25402fe0c2 100644 --- a/compiler/rustc_middle/src/ty/consts/kind.rs +++ b/compiler/rustc_middle/src/ty/consts/kind.rs @@ -22,11 +22,6 @@ impl rustc_errors::IntoDiagnosticArg for UnevaluatedConst<'_> { } impl<'tcx> UnevaluatedConst<'tcx> { - #[inline] - pub fn expand(self) -> mir::UnevaluatedConst<'tcx> { - mir::UnevaluatedConst { def: self.def, args: self.args, promoted: None } - } - /// FIXME(RalfJung): I cannot explain what this does or why it makes sense, but not doing this /// hurts performance. #[inline] diff --git a/compiler/rustc_monomorphize/src/collector.rs b/compiler/rustc_monomorphize/src/collector.rs index 8cbb68fc8c1..de677aaa5f5 100644 --- a/compiler/rustc_monomorphize/src/collector.rs +++ b/compiler/rustc_monomorphize/src/collector.rs @@ -749,39 +749,15 @@ impl<'a, 'tcx> MirVisitor<'tcx> for MirUsedCollector<'a, 'tcx> { #[instrument(skip(self), level = "debug")] fn visit_constant(&mut self, constant: &mir::Constant<'tcx>, location: Location) { let literal = self.monomorphize(constant.literal); - let val = match literal { - mir::ConstantKind::Val(val, _) => val, - mir::ConstantKind::Ty(ct) => match ct.kind() { - ty::ConstKind::Value(val) => self.tcx.valtree_to_const_val((ct.ty(), val)), - ty::ConstKind::Unevaluated(ct) => { - debug!(?ct); - let param_env = ty::ParamEnv::reveal_all(); - match self.tcx.const_eval_resolve(param_env, ct.expand(), None) { - // The `monomorphize` call should have evaluated that constant already. - Ok(val) => val, - Err(ErrorHandled::Reported(_)) => return, - Err(ErrorHandled::TooGeneric) => span_bug!( - self.body.source_info(location).span, - "collection encountered polymorphic constant: {:?}", - literal - ), - } - } - _ => return, - }, - mir::ConstantKind::Unevaluated(uv, _) => { - let param_env = ty::ParamEnv::reveal_all(); - match self.tcx.const_eval_resolve(param_env, uv, None) { - // The `monomorphize` call should have evaluated that constant already. - Ok(val) => val, - Err(ErrorHandled::Reported(_)) => return, - Err(ErrorHandled::TooGeneric) => span_bug!( - self.body.source_info(location).span, - "collection encountered polymorphic constant: {:?}", - literal - ), - } - } + let param_env = ty::ParamEnv::reveal_all(); + let val = match literal.eval(self.tcx, param_env, None) { + Ok(v) => v, + Err(ErrorHandled::Reported(_)) => return, + Err(ErrorHandled::TooGeneric) => span_bug!( + self.body.source_info(location).span, + "collection encountered polymorphic constant: {:?}", + literal + ), }; collect_const_value(self.tcx, val, self.output); MirVisitor::visit_ty(self, literal.ty(), TyContext::Location(location)); |
