diff options
| author | Eduard-Mihai Burtescu <edy.burt@gmail.com> | 2020-04-10 05:13:20 +0300 |
|---|---|---|
| committer | Eduard-Mihai Burtescu <edy.burt@gmail.com> | 2020-04-18 18:39:59 +0300 |
| commit | 0b83a5a8ae81f69dbfd1ed19566ab2d6eb588675 (patch) | |
| tree | 5b20386c482395a5dad2c72766ac35b152083423 | |
| parent | 339a938fa6582d5c6f84d811680a1031c684c1c6 (diff) | |
| download | rust-0b83a5a8ae81f69dbfd1ed19566ab2d6eb588675.tar.gz rust-0b83a5a8ae81f69dbfd1ed19566ab2d6eb588675.zip | |
ty/instance: use `ParamEnvAnd` in the `resolve_instance` query.
| -rw-r--r-- | src/librustc_middle/query/mod.rs | 6 | ||||
| -rw-r--r-- | src/librustc_middle/ty/instance.rs | 9 | ||||
| -rw-r--r-- | src/librustc_middle/ty/query/keys.rs | 11 | ||||
| -rw-r--r-- | src/librustc_ty/instance.rs | 6 |
4 files changed, 16 insertions, 16 deletions
diff --git a/src/librustc_middle/query/mod.rs b/src/librustc_middle/query/mod.rs index 3ddb290fc8d..c974ab3190e 100644 --- a/src/librustc_middle/query/mod.rs +++ b/src/librustc_middle/query/mod.rs @@ -1258,8 +1258,10 @@ rustc_queries! { desc { "looking up enabled feature gates" } } - query resolve_instance(key: (ty::ParamEnv<'tcx>, DefId, SubstsRef<'tcx>)) -> Option<ty::Instance<'tcx>> { - desc { "resolving instance `{:?}` `{:?}` with {:?}", key.1, key.2, key.0 } + query resolve_instance( + key: ty::ParamEnvAnd<'tcx, (DefId, SubstsRef<'tcx>)> + ) -> Option<ty::Instance<'tcx>> { + desc { "resolving instance `{}`", ty::Instance::new(key.value.0, key.value.1) } } } } diff --git a/src/librustc_middle/ty/instance.rs b/src/librustc_middle/ty/instance.rs index ca76cfb1492..0366795a20e 100644 --- a/src/librustc_middle/ty/instance.rs +++ b/src/librustc_middle/ty/instance.rs @@ -290,7 +290,14 @@ impl<'tcx> Instance<'tcx> { ) -> Option<Instance<'tcx>> { // All regions in the result of this query are erased, so it's // fine to erase all of the input regions. - tcx.resolve_instance((tcx.erase_regions(¶m_env), def_id, tcx.erase_regions(&substs))) + + // HACK(eddyb) erase regions in `substs` first, so that `param_env.and(...)` + // below is more likely to ignore the bounds in scope (e.g. if the only + // generic parameters mentioned by `substs` were lifetime ones). + let substs = tcx.erase_regions(&substs); + + // FIXME(eddyb) should this always use `param_env.with_reveal_all()`? + tcx.resolve_instance(tcx.erase_regions(¶m_env.and((def_id, substs)))) } pub fn resolve_for_fn_ptr( diff --git a/src/librustc_middle/ty/query/keys.rs b/src/librustc_middle/ty/query/keys.rs index 438e7ed4331..a261e484a85 100644 --- a/src/librustc_middle/ty/query/keys.rs +++ b/src/librustc_middle/ty/query/keys.rs @@ -296,14 +296,3 @@ impl Key for (Symbol, u32, u32) { DUMMY_SP } } - -impl<'tcx> Key for (ty::ParamEnv<'tcx>, DefId, SubstsRef<'tcx>) { - type CacheSelector = DefaultCacheSelector; - - fn query_crate(&self) -> CrateNum { - self.1.krate - } - fn default_span(&self, tcx: TyCtxt<'_>) -> Span { - tcx.def_span(self.1) - } -} diff --git a/src/librustc_ty/instance.rs b/src/librustc_ty/instance.rs index 955e2e36159..d50e7f39d41 100644 --- a/src/librustc_ty/instance.rs +++ b/src/librustc_ty/instance.rs @@ -9,10 +9,12 @@ use traits::{translate_substs, Reveal}; use log::debug; -pub fn resolve_instance<'tcx>( +fn resolve_instance<'tcx>( tcx: TyCtxt<'tcx>, - (param_env, def_id, substs): (ty::ParamEnv<'tcx>, DefId, SubstsRef<'tcx>), + key: ty::ParamEnvAnd<'tcx, (DefId, SubstsRef<'tcx>)>, ) -> Option<Instance<'tcx>> { + let (param_env, (def_id, substs)) = key.into_parts(); + debug!("resolve(def_id={:?}, substs={:?})", def_id, substs); let result = if let Some(trait_def_id) = tcx.trait_of_item(def_id) { debug!(" => associated item, attempting to find impl in param_env {:#?}", param_env); |
