Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-ty/src/specialization.rs')
| -rw-r--r-- | crates/hir-ty/src/specialization.rs | 26 |
1 files changed, 13 insertions, 13 deletions
diff --git a/crates/hir-ty/src/specialization.rs b/crates/hir-ty/src/specialization.rs index 8bc6c51fae..467b598447 100644 --- a/crates/hir-ty/src/specialization.rs +++ b/crates/hir-ty/src/specialization.rs @@ -1,17 +1,17 @@ //! Impl specialization related things use hir_def::{ - ExpressionStoreOwnerId, GenericDefId, HasModule, ImplId, nameres::crate_def_map, - signatures::ImplSignature, + ExpressionStoreOwnerId, GenericDefId, HasModule, ImplId, signatures::ImplSignature, + unstable_features::UnstableFeatures, }; -use intern::sym; use tracing::debug; use crate::{ + Span, db::HirDatabase, lower::GenericPredicates, next_solver::{ - DbInterner, TypingMode, + DbInterner, TypingMode, Unnormalized, infer::{DbInternerInferExt, traits::ObligationCause}, obligation_ctxt::ObligationCtxt, util::clauses_as_obligations, @@ -81,7 +81,7 @@ fn specializes_query( let infcx = interner.infer_ctxt().build(TypingMode::non_body_analysis()); let specializing_impl_trait_ref = - db.impl_trait(specializing_impl_def_id).unwrap().instantiate_identity(); + db.impl_trait(specializing_impl_def_id).unwrap().instantiate_identity().skip_norm_wip(); let cause = &ObligationCause::dummy(); debug!( "fulfill_implication({:?}, trait_ref={:?} |- {:?} applies)", @@ -92,11 +92,12 @@ fn specializes_query( let mut ocx = ObligationCtxt::new(&infcx); - let parent_args = infcx.fresh_args_for_item(parent_impl_def_id.into()); + let parent_args = infcx.fresh_args_for_item(Span::Dummy, parent_impl_def_id.into()); let parent_impl_trait_ref = db .impl_trait(parent_impl_def_id) .expect("expected source impl to be a trait impl") - .instantiate(interner, parent_args); + .instantiate(interner, parent_args) + .skip_norm_wip(); // do the impls unify? If not, no specialization. let Ok(()) = ocx.eq(cause, param_env, specializing_impl_trait_ref, parent_impl_trait_ref) @@ -109,8 +110,9 @@ fn specializes_query( // only be referenced via projection predicates. ocx.register_obligations(clauses_as_obligations( GenericPredicates::query_all(db, parent_impl_def_id.into()) - .iter_instantiated(interner, parent_args.as_slice()), - cause.clone(), + .iter_instantiated(interner, parent_args.as_slice()) + .map(Unnormalized::skip_norm_wip), + *cause, param_env, )); @@ -153,10 +155,8 @@ pub(crate) fn specializes( // `#[allow_internal_unstable(specialization)]`, but `#[allow_internal_unstable]` // is an internal feature, std is not using it for specialization nor is likely to // ever use it, and we don't have the span information necessary to replicate that. - let def_map = crate_def_map(db, module.krate(db)); - if !def_map.is_unstable_feature_enabled(&sym::specialization) - && !def_map.is_unstable_feature_enabled(&sym::min_specialization) - { + let features = UnstableFeatures::query(db, module.krate(db)); + if !features.specialization && !features.min_specialization { return false; } |