diff options
| author | Camille GILLOT <gillot.camille@gmail.com> | 2023-02-19 10:02:00 +0000 |
|---|---|---|
| committer | Camille GILLOT <gillot.camille@gmail.com> | 2023-04-20 17:13:39 +0000 |
| commit | 0e017fc94a5b35250fd1b0732e004e0112d09728 (patch) | |
| tree | 5e79b42629ef3438ac5435decb1cdeda43eb4a78 /compiler/rustc_middle/src | |
| parent | 4224b4b1f5695a70b268f36fa845ce9f224c1d6b (diff) | |
| download | rust-0e017fc94a5b35250fd1b0732e004e0112d09728.tar.gz rust-0e017fc94a5b35250fd1b0732e004e0112d09728.zip | |
Feed type_of query instead of using WithOptconstParam.
Diffstat (limited to 'compiler/rustc_middle/src')
| -rw-r--r-- | compiler/rustc_middle/src/ty/context.rs | 8 | ||||
| -rw-r--r-- | compiler/rustc_middle/src/ty/mod.rs | 14 | ||||
| -rw-r--r-- | compiler/rustc_middle/src/ty/query.rs | 26 |
3 files changed, 32 insertions, 16 deletions
diff --git a/compiler/rustc_middle/src/ty/context.rs b/compiler/rustc_middle/src/ty/context.rs index f9d3ffc8f00..ef2452aba73 100644 --- a/compiler/rustc_middle/src/ty/context.rs +++ b/compiler/rustc_middle/src/ty/context.rs @@ -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> { diff --git a/compiler/rustc_middle/src/ty/mod.rs b/compiler/rustc_middle/src/ty/mod.rs index 1061c320793..8932900fc1c 100644 --- a/compiler/rustc_middle/src/ty/mod.rs +++ b/compiler/rustc_middle/src/ty/mod.rs @@ -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() } } diff --git a/compiler/rustc_middle/src/ty/query.rs b/compiler/rustc_middle/src/ty/query.rs index 97592cbc567..e46cfb8dd16 100644 --- a/compiler/rustc_middle/src/ty/query.rs +++ b/compiler/rustc_middle/src/ty/query.rs @@ -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 } } } |
