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.rs26
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;
}