Feed type_of query instead of using WithOptconstParam.
This commit is contained in:
parent
4224b4b1f5
commit
0e017fc94a
7 changed files with 40 additions and 39 deletions
|
@ -449,6 +449,14 @@ impl<'tcx> TyCtxt<'tcx> {
|
|||
pub fn feed_local_crate(self) -> TyCtxtFeed<'tcx, CrateNum> {
|
||||
TyCtxtFeed { tcx: self, key: LOCAL_CRATE }
|
||||
}
|
||||
|
||||
/// In order to break cycles involving `AnonConst`, we need to set the expected type by side
|
||||
/// effect. However, we do not want this as a general capability, so this interface restricts
|
||||
/// to the only allowed case.
|
||||
pub fn feed_anon_const_type(self, key: LocalDefId, value: ty::EarlyBinder<Ty<'tcx>>) {
|
||||
debug_assert_eq!(self.def_kind(key), DefKind::AnonConst);
|
||||
TyCtxtFeed { tcx: self, key }.type_of(value)
|
||||
}
|
||||
}
|
||||
|
||||
impl<'tcx, KEY: Copy> TyCtxtFeed<'tcx, KEY> {
|
||||
|
|
|
@ -1548,20 +1548,14 @@ impl WithOptConstParam<LocalDefId> {
|
|||
/// Returns `Some((did, param_did))` if `def_id` is a const argument,
|
||||
/// `None` otherwise.
|
||||
#[inline(always)]
|
||||
pub fn try_lookup(did: LocalDefId, tcx: TyCtxt<'_>) -> Option<(LocalDefId, DefId)> {
|
||||
tcx.opt_const_param_of(did).map(|param_did| (did, param_did))
|
||||
pub fn try_lookup(_: LocalDefId, _: TyCtxt<'_>) -> Option<(LocalDefId, DefId)> {
|
||||
None
|
||||
}
|
||||
|
||||
/// 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_upgrade(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 });
|
||||
}
|
||||
}
|
||||
|
||||
pub fn try_upgrade(self, _: TyCtxt<'_>) -> Option<WithOptConstParam<LocalDefId>> {
|
||||
None
|
||||
}
|
||||
|
||||
|
@ -1570,7 +1564,7 @@ impl WithOptConstParam<LocalDefId> {
|
|||
}
|
||||
|
||||
pub fn def_id_for_type_of(self) -> DefId {
|
||||
if let Some(did) = self.const_param_did { did } else { self.did.to_def_id() }
|
||||
self.did.to_def_id()
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -76,6 +76,9 @@ use std::ops::Deref;
|
|||
use std::path::PathBuf;
|
||||
use std::sync::Arc;
|
||||
|
||||
use rustc_data_structures::fingerprint::Fingerprint;
|
||||
use rustc_query_system::ich::StableHashingContext;
|
||||
|
||||
#[derive(Default)]
|
||||
pub struct QuerySystem<'tcx> {
|
||||
pub arenas: QueryArenas<'tcx>,
|
||||
|
@ -477,7 +480,7 @@ macro_rules! define_feedable {
|
|||
$(impl<'tcx, K: IntoQueryParam<$($K)*> + Copy> TyCtxtFeed<'tcx, K> {
|
||||
$(#[$attr])*
|
||||
#[inline(always)]
|
||||
pub fn $name(self, value: query_provided::$name<'tcx>) -> $V {
|
||||
pub fn $name(self, value: query_provided::$name<'tcx>) {
|
||||
let key = self.key().into_query_param();
|
||||
|
||||
let tcx = self.tcx;
|
||||
|
@ -485,13 +488,25 @@ macro_rules! define_feedable {
|
|||
let value = restore::<$V>(erased);
|
||||
let cache = &tcx.query_system.caches.$name;
|
||||
|
||||
let hasher: Option<fn(&mut StableHashingContext<'_>, &_) -> _> = hash_result!([$($modifiers)*]);
|
||||
match try_get_cached(tcx, cache, &key) {
|
||||
Some(old) => {
|
||||
let old = restore::<$V>(old);
|
||||
bug!(
|
||||
"Trying to feed an already recorded value for query {} key={key:?}:\nold value: {old:?}\nnew value: {value:?}",
|
||||
stringify!($name),
|
||||
)
|
||||
if let Some(hasher) = hasher {
|
||||
let (value_hash, old_hash): (Fingerprint, Fingerprint) = tcx.with_stable_hashing_context(|mut hcx|
|
||||
(hasher(&mut hcx, &value), hasher(&mut hcx, &old))
|
||||
);
|
||||
assert_eq!(
|
||||
old_hash, value_hash,
|
||||
"Trying to feed an already recorded value for query {} key={key:?}:\nold value: {old:?}\nnew value: {value:?}",
|
||||
stringify!($name),
|
||||
)
|
||||
} else {
|
||||
bug!(
|
||||
"Trying to feed an already recorded value for query {} key={key:?}:\nold value: {old:?}\nnew value: {value:?}",
|
||||
stringify!($name),
|
||||
)
|
||||
}
|
||||
}
|
||||
None => {
|
||||
let dep_node = dep_graph::DepNode::construct(tcx, dep_graph::DepKind::$name, &key);
|
||||
|
@ -503,7 +518,6 @@ macro_rules! define_feedable {
|
|||
hash_result!([$($modifiers)*]),
|
||||
);
|
||||
cache.complete(key, erased, dep_node_index);
|
||||
value
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue