mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-30 02:33:55 +00:00
query normalize_generic_arg_after_erasing_regions
This commit is contained in:
parent
bda976d42d
commit
d7ecc8c9bc
@ -59,7 +59,7 @@ use crate::traits::query::{
|
||||
CanonicalTypeOpAscribeUserTypeGoal, CanonicalTypeOpEqGoal, CanonicalTypeOpNormalizeGoal,
|
||||
CanonicalTypeOpProvePredicateGoal, CanonicalTypeOpSubtypeGoal,
|
||||
};
|
||||
use crate::ty::subst::SubstsRef;
|
||||
use crate::ty::subst::{GenericArg, SubstsRef};
|
||||
use crate::ty::{self, ParamEnvAnd, Ty, TyCtxt};
|
||||
|
||||
use rustc_data_structures::stable_hasher::{HashStable, StableHasher};
|
||||
|
@ -9,7 +9,7 @@ use crate::traits::query::{
|
||||
};
|
||||
use crate::ty::query::queries;
|
||||
use crate::ty::query::QueryDescription;
|
||||
use crate::ty::subst::SubstsRef;
|
||||
use crate::ty::subst::{GenericArg, SubstsRef};
|
||||
use crate::ty::{self, ParamEnvAnd, Ty, TyCtxt};
|
||||
use rustc_hir::def_id::{CrateNum, DefId, LocalDefId};
|
||||
|
||||
@ -1114,9 +1114,9 @@ rustc_queries! {
|
||||
}
|
||||
|
||||
/// Do not call this query directly: invoke `normalize_erasing_regions` instead.
|
||||
query normalize_ty_after_erasing_regions(
|
||||
goal: ParamEnvAnd<'tcx, Ty<'tcx>>
|
||||
) -> Ty<'tcx> {
|
||||
query normalize_generic_arg_after_erasing_regions(
|
||||
goal: ParamEnvAnd<'tcx, GenericArg<'tcx>>
|
||||
) -> GenericArg<'tcx> {
|
||||
desc { "normalizing `{:?}`", goal }
|
||||
}
|
||||
|
||||
|
@ -4,8 +4,8 @@
|
||||
//!
|
||||
//! The methods in this file use a `TypeFolder` to recursively process
|
||||
//! contents, invoking the underlying
|
||||
//! `normalize_ty_after_erasing_regions` query for each type found
|
||||
//! within. (This underlying query is what is cached.)
|
||||
//! `normalize_generic_arg_after_erasing_regions` query for each type
|
||||
//! or constant found within. (This underlying query is what is cached.)
|
||||
|
||||
use crate::ty::fold::{TypeFoldable, TypeFolder};
|
||||
use crate::ty::subst::{Subst, SubstsRef};
|
||||
@ -94,6 +94,14 @@ impl TypeFolder<'tcx> for NormalizeAfterErasingRegionsFolder<'tcx> {
|
||||
}
|
||||
|
||||
fn fold_ty(&mut self, ty: Ty<'tcx>) -> Ty<'tcx> {
|
||||
self.tcx.normalize_ty_after_erasing_regions(self.param_env.and(ty))
|
||||
self.tcx
|
||||
.normalize_generic_arg_after_erasing_regions(self.param_env.and(ty.into()))
|
||||
.expect_ty()
|
||||
}
|
||||
|
||||
fn fold_const(&mut self, c: &'tcx ty::Const<'tcx>) -> &'tcx ty::Const<'tcx> {
|
||||
self.tcx
|
||||
.normalize_generic_arg_after_erasing_regions(self.param_env.and(c.into()))
|
||||
.expect_const()
|
||||
}
|
||||
}
|
||||
|
@ -5,7 +5,7 @@ use crate::mir;
|
||||
use crate::traits;
|
||||
use crate::ty::fast_reject::SimplifiedType;
|
||||
use crate::ty::query::caches::DefaultCacheSelector;
|
||||
use crate::ty::subst::SubstsRef;
|
||||
use crate::ty::subst::{GenericArg, SubstsRef};
|
||||
use crate::ty::{self, Ty, TyCtxt};
|
||||
use rustc_hir::def_id::{CrateNum, DefId, LocalDefId, LOCAL_CRATE};
|
||||
use rustc_span::symbol::Symbol;
|
||||
@ -194,6 +194,17 @@ impl<'tcx> Key for ty::PolyTraitRef<'tcx> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<'tcx> Key for GenericArg<'tcx> {
|
||||
type CacheSelector = DefaultCacheSelector;
|
||||
|
||||
fn query_crate(&self) -> CrateNum {
|
||||
LOCAL_CRATE
|
||||
}
|
||||
fn default_span(&self, _: TyCtxt<'_>) -> Span {
|
||||
DUMMY_SP
|
||||
}
|
||||
}
|
||||
|
||||
impl<'tcx> Key for &'tcx ty::Const<'tcx> {
|
||||
type CacheSelector = DefaultCacheSelector;
|
||||
|
||||
|
@ -31,7 +31,7 @@ use crate::traits::specialization_graph;
|
||||
use crate::traits::Clauses;
|
||||
use crate::traits::{self, Vtable};
|
||||
use crate::ty::steal::Steal;
|
||||
use crate::ty::subst::SubstsRef;
|
||||
use crate::ty::subst::{GenericArg, SubstsRef};
|
||||
use crate::ty::util::AlwaysRequiresDrop;
|
||||
use crate::ty::{self, AdtSizedConstraint, CrateInherentImpls, ParamEnvAnd, Ty, TyCtxt};
|
||||
use crate::util::common::ErrorReported;
|
||||
|
@ -128,6 +128,14 @@ impl<'tcx> GenericArg<'tcx> {
|
||||
_ => bug!("expected a type, but found another kind"),
|
||||
}
|
||||
}
|
||||
|
||||
/// Unpack the `GenericArg` as a const when it is known certainly to be a const.
|
||||
pub fn expect_const(self) -> &'tcx ty::Const<'tcx> {
|
||||
match self.unpack() {
|
||||
GenericArgKind::Const(c) => c,
|
||||
_ => bug!("expected a const, but found another kind"),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, 'tcx> Lift<'tcx> for GenericArg<'a> {
|
||||
|
@ -150,7 +150,7 @@ pub struct PerfStats {
|
||||
/// Total number of values canonicalized queries constructed.
|
||||
pub queries_canonicalized: AtomicUsize,
|
||||
/// Number of times this query is invoked.
|
||||
pub normalize_ty_after_erasing_regions: AtomicUsize,
|
||||
pub normalize_generic_arg_after_erasing_regions: AtomicUsize,
|
||||
/// Number of times this query is invoked.
|
||||
pub normalize_projection_ty: AtomicUsize,
|
||||
}
|
||||
@ -707,8 +707,8 @@ impl Session {
|
||||
self.perf_stats.queries_canonicalized.load(Ordering::Relaxed)
|
||||
);
|
||||
println!(
|
||||
"normalize_ty_after_erasing_regions: {}",
|
||||
self.perf_stats.normalize_ty_after_erasing_regions.load(Ordering::Relaxed)
|
||||
"normalize_generic_arg_after_erasing_regions: {}",
|
||||
self.perf_stats.normalize_generic_arg_after_erasing_regions.load(Ordering::Relaxed)
|
||||
);
|
||||
println!(
|
||||
"normalize_projection_ty: {}",
|
||||
@ -1080,7 +1080,7 @@ fn build_session_(
|
||||
symbol_hash_time: Lock::new(Duration::from_secs(0)),
|
||||
decode_def_path_tables_time: Lock::new(Duration::from_secs(0)),
|
||||
queries_canonicalized: AtomicUsize::new(0),
|
||||
normalize_ty_after_erasing_regions: AtomicUsize::new(0),
|
||||
normalize_generic_arg_after_erasing_regions: AtomicUsize::new(0),
|
||||
normalize_projection_ty: AtomicUsize::new(0),
|
||||
},
|
||||
code_stats: Default::default(),
|
||||
|
@ -1,23 +1,24 @@
|
||||
use rustc::traits::query::NoSolution;
|
||||
use rustc::ty::query::Providers;
|
||||
use rustc::ty::{self, ParamEnvAnd, Ty, TyCtxt};
|
||||
use rustc::ty::subst::GenericArg;
|
||||
use rustc::ty::{self, ParamEnvAnd, TyCtxt};
|
||||
use rustc_infer::infer::TyCtxtInferExt;
|
||||
use rustc_trait_selection::traits::query::normalize::AtExt;
|
||||
use rustc_trait_selection::traits::{Normalized, ObligationCause};
|
||||
use std::sync::atomic::Ordering;
|
||||
|
||||
crate fn provide(p: &mut Providers<'_>) {
|
||||
*p = Providers { normalize_ty_after_erasing_regions, ..*p };
|
||||
*p = Providers { normalize_generic_arg_after_erasing_regions, ..*p };
|
||||
}
|
||||
|
||||
fn normalize_ty_after_erasing_regions<'tcx>(
|
||||
fn normalize_generic_arg_after_erasing_regions<'tcx>(
|
||||
tcx: TyCtxt<'tcx>,
|
||||
goal: ParamEnvAnd<'tcx, Ty<'tcx>>,
|
||||
) -> Ty<'tcx> {
|
||||
debug!("normalize_ty_after_erasing_regions(goal={:#?})", goal);
|
||||
goal: ParamEnvAnd<'tcx, GenericArg<'tcx>>,
|
||||
) -> GenericArg<'tcx> {
|
||||
debug!("normalize_generic_arg_after_erasing_regions(goal={:#?})", goal);
|
||||
|
||||
let ParamEnvAnd { param_env, value } = goal;
|
||||
tcx.sess.perf_stats.normalize_ty_after_erasing_regions.fetch_add(1, Ordering::Relaxed);
|
||||
tcx.sess.perf_stats.normalize_generic_arg_after_erasing_regions.fetch_add(1, Ordering::Relaxed);
|
||||
tcx.infer_ctxt().enter(|infcx| {
|
||||
let cause = ObligationCause::dummy();
|
||||
match infcx.at(&cause, param_env).normalize(&value) {
|
||||
|
Loading…
Reference in New Issue
Block a user