//! Values computed by queries that use MIR.
-use crate::mir::{Body, Promoted};
+use crate::mir::{abstract_const, Body, Promoted};
use crate::ty::{self, Ty, TyCtxt};
use rustc_data_structures::fx::FxHashMap;
use rustc_data_structures::sync::Lrc;
+use rustc_errors::ErrorReported;
use rustc_hir as hir;
use rustc_hir::def_id::{DefId, LocalDefId};
use rustc_index::bit_set::BitMatrix;
pub num_expressions: u32,
}
+/// Shims which make dealing with `WithOptConstParam` easier.
+///
+/// For more information on why this is needed, consider looking
+/// at the docs for `WithOptConstParam` itself.
impl<'tcx> TyCtxt<'tcx> {
+ #[inline]
pub fn mir_borrowck_opt_const_arg(
self,
def: ty::WithOptConstParam<LocalDefId>,
}
}
+ #[inline]
pub fn mir_const_qualif_opt_const_arg(
self,
def: ty::WithOptConstParam<LocalDefId>,
}
}
+ #[inline]
pub fn promoted_mir_of_opt_const_arg(
self,
def: ty::WithOptConstParam<DefId>,
self.promoted_mir(def.did)
}
}
+
+ #[inline]
+ pub fn optimized_mir_of_opt_const_arg(
+ self,
+ def: ty::WithOptConstParam<DefId>,
+ ) -> &'tcx Body<'tcx> {
+ if let Some((did, param_did)) = def.as_const_arg() {
+ self.optimized_mir_of_const_arg((did, param_did))
+ } else {
+ self.optimized_mir(def.did)
+ }
+ }
+
+ #[inline]
+ pub fn mir_abstract_const_of_opt_const_arg(
+ self,
+ def: ty::WithOptConstParam<DefId>,
+ ) -> Result<Option<&'tcx [abstract_const::Node<'tcx>]>, ErrorReported> {
+ if let Some((did, param_did)) = def.as_const_arg() {
+ self.mir_abstract_const_of_const_arg((did, param_did))
+ } else {
+ self.mir_abstract_const(def.did)
+ }
+ }
}
/// Returns the possibly-auto-generated MIR of a `(DefId, Subst)` pair.
pub fn instance_mir(self, instance: ty::InstanceDef<'tcx>) -> &'tcx Body<'tcx> {
match instance {
- ty::InstanceDef::Item(def) => {
- if let Some((did, param_did)) = def.as_const_arg() {
- self.optimized_mir_of_const_arg((did, param_did))
- } else {
- self.optimized_mir(def.did)
- }
- }
+ ty::InstanceDef::Item(def) => self.optimized_mir_of_opt_const_arg(def),
ty::InstanceDef::VtableShim(..)
| ty::InstanceDef::ReifyShim(..)
| ty::InstanceDef::Intrinsic(..)
match instance {
ty::InstanceDef::Item(def) => {
if self.tcx.is_mir_available(def.did) {
- if let Some((did, param_did)) = def.as_const_arg() {
- Ok(self.tcx.optimized_mir_of_const_arg((did, param_did)))
- } else {
- Ok(self.tcx.optimized_mir(def.did))
- }
+ Ok(self.tcx.optimized_mir_of_opt_const_arg(def))
} else {
throw_unsup!(NoMirFor(def.did))
}
// this point, before we steal the mir-const result.
// Also this means promotion can rely on all const checks having been done.
let _ = tcx.mir_const_qualif_opt_const_arg(def);
- let _ = if let Some(param_did) = def.const_param_did {
- tcx.mir_abstract_const_of_const_arg((def.did, param_did))
- } else {
- tcx.mir_abstract_const(def.did.to_def_id())
- };
+ let _ = tcx.mir_abstract_const_of_opt_const_arg(def.to_global());
let mut body = tcx.mir_const(def).steal();
let mut required_consts = Vec::new();
if concrete.is_ok() && substs.has_param_types_or_consts() {
match infcx.tcx.def_kind(def.did) {
DefKind::AnonConst => {
- let mir_body = if let Some(def) = def.as_const_arg() {
- infcx.tcx.optimized_mir_of_const_arg(def)
- } else {
- infcx.tcx.optimized_mir(def.did)
- };
+ let mir_body = infcx.tcx.optimized_mir_of_opt_const_arg(def);
if mir_body.is_polymorphic {
future_compat_lint();
def: ty::WithOptConstParam<DefId>,
substs: SubstsRef<'tcx>,
) -> Result<Option<AbstractConst<'tcx>>, ErrorReported> {
- let inner = match (def.did.as_local(), def.const_param_did) {
- (Some(did), Some(param_did)) => {
- tcx.mir_abstract_const_of_const_arg((did, param_did))?
- }
- _ => tcx.mir_abstract_const(def.did)?,
- };
-
+ let inner = tcx.mir_abstract_const_of_opt_const_arg(def)?;
Ok(inner.map(|inner| AbstractConst { inner, substs }))
}