remove some const arg in ty dep path boilerplate
This commit is contained in:
parent
8ad7bc3f42
commit
ebc0c15610
5 changed files with 57 additions and 54 deletions
|
@ -1617,12 +1617,33 @@ pub struct WithOptConstParam<T> {
|
||||||
|
|
||||||
impl<T> WithOptConstParam<T> {
|
impl<T> WithOptConstParam<T> {
|
||||||
/// Creates a new `WithOptConstParam` setting `const_param_did` to `None`.
|
/// Creates a new `WithOptConstParam` setting `const_param_did` to `None`.
|
||||||
|
#[inline(always)]
|
||||||
pub fn unknown(did: T) -> WithOptConstParam<T> {
|
pub fn unknown(did: T) -> WithOptConstParam<T> {
|
||||||
WithOptConstParam { did, const_param_did: None }
|
WithOptConstParam { did, const_param_did: None }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl WithOptConstParam<LocalDefId> {
|
impl WithOptConstParam<LocalDefId> {
|
||||||
|
/// Returns `Some((did, param_did))` if `def_id` is a const argument,
|
||||||
|
/// `None` otherwise.
|
||||||
|
#[inline(always)]
|
||||||
|
pub fn try_fetch(did: LocalDefId, tcx: TyCtxt<'_>) -> Option<(LocalDefId, DefId)> {
|
||||||
|
tcx.opt_const_param_of(did).map(|param_did| (did, param_did))
|
||||||
|
}
|
||||||
|
|
||||||
|
/// In case `self` is unknown but `self.did` is a const argument, this returns
|
||||||
|
/// a `WithOptConstParam` with the correct `const_param_did`.
|
||||||
|
#[inline(always)]
|
||||||
|
pub fn try_update(self, tcx: TyCtxt<'_>) -> Option<WithOptConstParam<LocalDefId>> {
|
||||||
|
if self.const_param_did.is_none() {
|
||||||
|
if let const_param_did @ Some(_) = tcx.opt_const_param_of(self.did) {
|
||||||
|
return Some(WithOptConstParam { did: self.did, const_param_did });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
None
|
||||||
|
}
|
||||||
|
|
||||||
pub fn to_global(self) -> WithOptConstParam<DefId> {
|
pub fn to_global(self) -> WithOptConstParam<DefId> {
|
||||||
WithOptConstParam { did: self.did.to_def_id(), const_param_did: self.const_param_did }
|
WithOptConstParam { did: self.did.to_def_id(), const_param_did: self.const_param_did }
|
||||||
}
|
}
|
||||||
|
|
|
@ -88,7 +88,13 @@ const DEREF_PROJECTION: &[PlaceElem<'_>; 1] = &[ProjectionElem::Deref];
|
||||||
|
|
||||||
pub fn provide(providers: &mut Providers) {
|
pub fn provide(providers: &mut Providers) {
|
||||||
*providers = Providers {
|
*providers = Providers {
|
||||||
mir_borrowck: |tcx, did| mir_borrowck(tcx, ty::WithOptConstParam::unknown(did)),
|
mir_borrowck: |tcx, did| {
|
||||||
|
if let Some(def) = ty::WithOptConstParam::try_fetch(did, tcx) {
|
||||||
|
tcx.mir_borrowck_const_arg(def)
|
||||||
|
} else {
|
||||||
|
mir_borrowck(tcx, ty::WithOptConstParam::unknown(did))
|
||||||
|
}
|
||||||
|
},
|
||||||
mir_borrowck_const_arg: |tcx, (did, param_did)| {
|
mir_borrowck_const_arg: |tcx, (did, param_did)| {
|
||||||
mir_borrowck(tcx, ty::WithOptConstParam { did, const_param_did: Some(param_did) })
|
mir_borrowck(tcx, ty::WithOptConstParam { did, const_param_did: Some(param_did) })
|
||||||
},
|
},
|
||||||
|
@ -100,12 +106,6 @@ fn mir_borrowck<'tcx>(
|
||||||
tcx: TyCtxt<'tcx>,
|
tcx: TyCtxt<'tcx>,
|
||||||
def: ty::WithOptConstParam<LocalDefId>,
|
def: ty::WithOptConstParam<LocalDefId>,
|
||||||
) -> &'tcx BorrowCheckResult<'tcx> {
|
) -> &'tcx BorrowCheckResult<'tcx> {
|
||||||
if def.const_param_did.is_none() {
|
|
||||||
if let Some(param_did) = tcx.opt_const_param_of(def.did) {
|
|
||||||
return tcx.mir_borrowck_const_arg((def.did, param_did));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
let (input_body, promoted) = tcx.mir_validated(def);
|
let (input_body, promoted) = tcx.mir_validated(def);
|
||||||
debug!("run query mir_borrowck: {}", tcx.def_path_str(def.did.to_def_id()));
|
debug!("run query mir_borrowck: {}", tcx.def_path_str(def.did.to_def_id()));
|
||||||
|
|
||||||
|
|
|
@ -439,7 +439,11 @@ impl<'a, 'tcx> UnsafetyChecker<'a, 'tcx> {
|
||||||
pub(crate) fn provide(providers: &mut Providers) {
|
pub(crate) fn provide(providers: &mut Providers) {
|
||||||
*providers = Providers {
|
*providers = Providers {
|
||||||
unsafety_check_result: |tcx, def_id| {
|
unsafety_check_result: |tcx, def_id| {
|
||||||
unsafety_check_result(tcx, ty::WithOptConstParam::unknown(def_id))
|
if let Some(def) = ty::WithOptConstParam::try_fetch(def_id, tcx) {
|
||||||
|
tcx.unsafety_check_result_for_const_arg(def)
|
||||||
|
} else {
|
||||||
|
unsafety_check_result(tcx, ty::WithOptConstParam::unknown(def_id))
|
||||||
|
}
|
||||||
},
|
},
|
||||||
unsafety_check_result_for_const_arg: |tcx, (did, param_did)| {
|
unsafety_check_result_for_const_arg: |tcx, (did, param_did)| {
|
||||||
unsafety_check_result(
|
unsafety_check_result(
|
||||||
|
@ -499,12 +503,6 @@ fn unsafety_check_result<'tcx>(
|
||||||
tcx: TyCtxt<'tcx>,
|
tcx: TyCtxt<'tcx>,
|
||||||
def: ty::WithOptConstParam<LocalDefId>,
|
def: ty::WithOptConstParam<LocalDefId>,
|
||||||
) -> &'tcx UnsafetyCheckResult {
|
) -> &'tcx UnsafetyCheckResult {
|
||||||
if def.const_param_did.is_none() {
|
|
||||||
if let Some(param_did) = tcx.opt_const_param_of(def.did) {
|
|
||||||
return tcx.unsafety_check_result_for_const_arg((def.did, param_did));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
debug!("unsafety_violations({:?})", def);
|
debug!("unsafety_violations({:?})", def);
|
||||||
|
|
||||||
// N.B., this borrow is valid because all the consumers of
|
// N.B., this borrow is valid because all the consumers of
|
||||||
|
|
|
@ -48,8 +48,13 @@ pub(crate) fn provide(providers: &mut Providers) {
|
||||||
*providers = Providers {
|
*providers = Providers {
|
||||||
mir_keys,
|
mir_keys,
|
||||||
mir_const,
|
mir_const,
|
||||||
mir_const_qualif: |tcx, did| {
|
mir_const_qualif: |tcx, def_id| {
|
||||||
mir_const_qualif(tcx, ty::WithOptConstParam::unknown(did.expect_local()))
|
let def_id = def_id.expect_local();
|
||||||
|
if let Some(def) = ty::WithOptConstParam::try_fetch(def_id, tcx) {
|
||||||
|
tcx.mir_const_qualif_const_arg(def)
|
||||||
|
} else {
|
||||||
|
mir_const_qualif(tcx, ty::WithOptConstParam::unknown(def_id))
|
||||||
|
}
|
||||||
},
|
},
|
||||||
mir_const_qualif_const_arg: |tcx, (did, param_did)| {
|
mir_const_qualif_const_arg: |tcx, (did, param_did)| {
|
||||||
mir_const_qualif(tcx, ty::WithOptConstParam { did, const_param_did: Some(param_did) })
|
mir_const_qualif(tcx, ty::WithOptConstParam { did, const_param_did: Some(param_did) })
|
||||||
|
@ -60,7 +65,12 @@ pub(crate) fn provide(providers: &mut Providers) {
|
||||||
optimized_mir_of_const_arg,
|
optimized_mir_of_const_arg,
|
||||||
is_mir_available,
|
is_mir_available,
|
||||||
promoted_mir: |tcx, def_id| {
|
promoted_mir: |tcx, def_id| {
|
||||||
promoted_mir(tcx, ty::WithOptConstParam::unknown(def_id.expect_local()))
|
let def_id = def_id.expect_local();
|
||||||
|
if let Some(def) = ty::WithOptConstParam::try_fetch(def_id, tcx) {
|
||||||
|
tcx.promoted_mir_of_const_arg(def)
|
||||||
|
} else {
|
||||||
|
promoted_mir(tcx, ty::WithOptConstParam::unknown(def_id))
|
||||||
|
}
|
||||||
},
|
},
|
||||||
promoted_mir_of_const_arg: |tcx, (did, param_did)| {
|
promoted_mir_of_const_arg: |tcx, (did, param_did)| {
|
||||||
promoted_mir(tcx, ty::WithOptConstParam { did, const_param_did: Some(param_did) })
|
promoted_mir(tcx, ty::WithOptConstParam { did, const_param_did: Some(param_did) })
|
||||||
|
@ -221,12 +231,6 @@ pub fn run_passes(
|
||||||
}
|
}
|
||||||
|
|
||||||
fn mir_const_qualif(tcx: TyCtxt<'_>, def: ty::WithOptConstParam<LocalDefId>) -> ConstQualifs {
|
fn mir_const_qualif(tcx: TyCtxt<'_>, def: ty::WithOptConstParam<LocalDefId>) -> ConstQualifs {
|
||||||
if def.const_param_did.is_none() {
|
|
||||||
if let Some(param_did) = tcx.opt_const_param_of(def.did) {
|
|
||||||
return tcx.mir_const_qualif_const_arg((def.did, param_did));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
let const_kind = tcx.hir().body_const_context(def.did);
|
let const_kind = tcx.hir().body_const_context(def.did);
|
||||||
|
|
||||||
// No need to const-check a non-const `fn`.
|
// No need to const-check a non-const `fn`.
|
||||||
|
@ -266,10 +270,8 @@ fn mir_const<'tcx>(
|
||||||
tcx: TyCtxt<'tcx>,
|
tcx: TyCtxt<'tcx>,
|
||||||
def: ty::WithOptConstParam<LocalDefId>,
|
def: ty::WithOptConstParam<LocalDefId>,
|
||||||
) -> &'tcx Steal<Body<'tcx>> {
|
) -> &'tcx Steal<Body<'tcx>> {
|
||||||
if def.const_param_did.is_none() {
|
if let Some(def) = ty::WithOptConstParam::try_update(def, tcx) {
|
||||||
if let const_param_did @ Some(_) = tcx.opt_const_param_of(def.did) {
|
return tcx.mir_const(def);
|
||||||
return tcx.mir_const(ty::WithOptConstParam { const_param_did, ..def });
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Unsafety check uses the raw mir, so make sure it is run.
|
// Unsafety check uses the raw mir, so make sure it is run.
|
||||||
|
@ -312,10 +314,8 @@ fn mir_validated(
|
||||||
tcx: TyCtxt<'tcx>,
|
tcx: TyCtxt<'tcx>,
|
||||||
def: ty::WithOptConstParam<LocalDefId>,
|
def: ty::WithOptConstParam<LocalDefId>,
|
||||||
) -> (&'tcx Steal<Body<'tcx>>, &'tcx Steal<IndexVec<Promoted, Body<'tcx>>>) {
|
) -> (&'tcx Steal<Body<'tcx>>, &'tcx Steal<IndexVec<Promoted, Body<'tcx>>>) {
|
||||||
if def.const_param_did.is_none() {
|
if let Some(def) = ty::WithOptConstParam::try_update(def, tcx) {
|
||||||
if let const_param_did @ Some(_) = tcx.opt_const_param_of(def.did) {
|
return tcx.mir_validated(def);
|
||||||
return tcx.mir_validated(ty::WithOptConstParam { const_param_did, ..def });
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Ensure that we compute the `mir_const_qualif` for constants at
|
// Ensure that we compute the `mir_const_qualif` for constants at
|
||||||
|
@ -357,13 +357,8 @@ fn mir_drops_elaborated_and_const_checked<'tcx>(
|
||||||
tcx: TyCtxt<'tcx>,
|
tcx: TyCtxt<'tcx>,
|
||||||
def: ty::WithOptConstParam<LocalDefId>,
|
def: ty::WithOptConstParam<LocalDefId>,
|
||||||
) -> &'tcx Steal<Body<'tcx>> {
|
) -> &'tcx Steal<Body<'tcx>> {
|
||||||
if def.const_param_did.is_none() {
|
if let Some(def) = ty::WithOptConstParam::try_update(def, tcx) {
|
||||||
if let const_param_did @ Some(_) = tcx.opt_const_param_of(def.did) {
|
return tcx.mir_drops_elaborated_and_const_checked(def);
|
||||||
return tcx.mir_drops_elaborated_and_const_checked(ty::WithOptConstParam {
|
|
||||||
const_param_did,
|
|
||||||
..def
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// (Mir-)Borrowck uses `mir_validated`, so we have to force it to
|
// (Mir-)Borrowck uses `mir_validated`, so we have to force it to
|
||||||
|
@ -490,8 +485,8 @@ fn run_optimization_passes<'tcx>(
|
||||||
|
|
||||||
fn optimized_mir<'tcx>(tcx: TyCtxt<'tcx>, did: DefId) -> &'tcx Body<'tcx> {
|
fn optimized_mir<'tcx>(tcx: TyCtxt<'tcx>, did: DefId) -> &'tcx Body<'tcx> {
|
||||||
let did = did.expect_local();
|
let did = did.expect_local();
|
||||||
if let Some(param_did) = tcx.opt_const_param_of(did) {
|
if let Some(def) = ty::WithOptConstParam::try_fetch(did, tcx) {
|
||||||
tcx.optimized_mir_of_const_arg((did, param_did))
|
tcx.optimized_mir_of_const_arg(def)
|
||||||
} else {
|
} else {
|
||||||
tcx.arena.alloc(inner_optimized_mir(tcx, ty::WithOptConstParam::unknown(did)))
|
tcx.arena.alloc(inner_optimized_mir(tcx, ty::WithOptConstParam::unknown(did)))
|
||||||
}
|
}
|
||||||
|
@ -528,12 +523,6 @@ fn promoted_mir<'tcx>(
|
||||||
tcx: TyCtxt<'tcx>,
|
tcx: TyCtxt<'tcx>,
|
||||||
def: ty::WithOptConstParam<LocalDefId>,
|
def: ty::WithOptConstParam<LocalDefId>,
|
||||||
) -> &'tcx IndexVec<Promoted, Body<'tcx>> {
|
) -> &'tcx IndexVec<Promoted, Body<'tcx>> {
|
||||||
if def.const_param_did.is_none() {
|
|
||||||
if let Some(param_did) = tcx.opt_const_param_of(def.did) {
|
|
||||||
return tcx.promoted_mir_of_const_arg((def.did, param_did));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if tcx.is_constructor(def.did.to_def_id()) {
|
if tcx.is_constructor(def.did.to_def_id()) {
|
||||||
return tcx.arena.alloc(IndexVec::new());
|
return tcx.arena.alloc(IndexVec::new());
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,14 +21,9 @@ use rustc_target::spec::PanicStrategy;
|
||||||
|
|
||||||
use super::lints;
|
use super::lints;
|
||||||
|
|
||||||
crate fn mir_built<'tcx>(
|
crate fn mir_built<'tcx>(tcx: TyCtxt<'tcx>, def: ty::WithOptConstParam<LocalDefId>) -> &'tcx ty::steal::Steal<Body<'tcx>> {
|
||||||
tcx: TyCtxt<'tcx>,
|
if let Some(def) = ty::WithOptConstParam::try_update(def, tcx) {
|
||||||
def: ty::WithOptConstParam<LocalDefId>,
|
return tcx.mir_built(def);
|
||||||
) -> &'tcx ty::steal::Steal<Body<'tcx>> {
|
|
||||||
if def.const_param_did.is_none() {
|
|
||||||
if let const_param_did @ Some(_) = tcx.opt_const_param_of(def.did) {
|
|
||||||
return tcx.mir_built(ty::WithOptConstParam { const_param_did, ..def });
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
tcx.alloc_steal_mir(mir_build(tcx, def))
|
tcx.alloc_steal_mir(mir_build(tcx, def))
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue