Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-ty/src/dyn_compatibility.rs')
| -rw-r--r-- | crates/hir-ty/src/dyn_compatibility.rs | 33 |
1 files changed, 13 insertions, 20 deletions
diff --git a/crates/hir-ty/src/dyn_compatibility.rs b/crates/hir-ty/src/dyn_compatibility.rs index 0cf7f650f0..5ffb27af26 100644 --- a/crates/hir-ty/src/dyn_compatibility.rs +++ b/crates/hir-ty/src/dyn_compatibility.rs @@ -22,7 +22,7 @@ use crate::{ lower::{GenericPredicates, associated_ty_item_bounds}, next_solver::{ AliasTy, Binder, Clause, Clauses, DbInterner, EarlyBinder, GenericArgs, ParamEnv, ParamTy, - SolverDefId, TraitPredicate, TraitRef, Ty, TypingMode, + SolverDefId, TraitPredicate, TraitRef, Ty, TypingMode, Unnormalized, infer::{ DbInternerInferExt, traits::{Obligation, ObligationCause}, @@ -146,8 +146,8 @@ pub fn generics_require_sized_self(db: &dyn HirDatabase, def: GenericDefId) -> b // FIXME: We should use `explicit_predicates_of` here, which hasn't been implemented to // rust-analyzer yet // https://github.com/rust-lang/rust/blob/ddaf12390d3ffb7d5ba74491a48f3cd528e5d777/compiler/rustc_hir_analysis/src/collect/predicates_of.rs#L490 - elaborate::elaborate(interner, predicates.iter_identity()).any(|pred| { - match pred.kind().skip_binder() { + elaborate::elaborate(interner, predicates.iter_identity().map(Unnormalized::skip_norm_wip)).any( + |pred| match pred.kind().skip_binder() { ClauseKind::Trait(trait_pred) => { if sized == trait_pred.def_id().0 && let rustc_type_ir::TyKind::Param(param_ty) = @@ -160,17 +160,17 @@ pub fn generics_require_sized_self(db: &dyn HirDatabase, def: GenericDefId) -> b } } _ => false, - } - }) + }, + ) } // rustc gathers all the spans that references `Self` for error rendering, // but we don't have good way to render such locations. // So, just return single boolean value for existence of such `Self` reference fn predicates_reference_self(db: &dyn HirDatabase, trait_: TraitId) -> bool { - GenericPredicates::query_explicit(db, trait_.into()) - .iter_identity() - .any(|pred| predicate_references_self(db, trait_, pred, AllowSelfProjection::No)) + GenericPredicates::query_explicit(db, trait_.into()).iter_identity().any(|pred| { + predicate_references_self(db, trait_, pred.skip_norm_wip(), AllowSelfProjection::No) + }) } // Same as the above, `predicates_reference_self` @@ -248,11 +248,7 @@ fn contains_illegal_self_type_reference<'db, T: rustc_type_ir::TypeVisitable<DbI proj @ AliasTy { kind: AliasTyKind::Projection { .. }, .. }, ) => match self.allow_self_projection { AllowSelfProjection::Yes => { - let trait_ = proj.trait_def_id(interner); - let trait_ = match trait_ { - SolverDefId::TraitId(id) => id, - _ => unreachable!(), - }; + let trait_ = proj.trait_def_id(interner).0; if self.super_traits.is_none() { self.super_traits = Some( elaborate::supertrait_def_ids(interner, self.trait_.into()) @@ -404,7 +400,7 @@ fn receiver_is_dispatchable<'db>( func: FunctionId, sig: &EarlyBinder<'db, Binder<'db, rustc_type_ir::FnSig<DbInterner<'db>>>>, ) -> bool { - let sig = sig.instantiate_identity(); + let sig = sig.instantiate_identity().skip_norm_wip(); let module = trait_.module(db); let interner = DbInterner::new_with(db, module.krate(db)); @@ -468,6 +464,7 @@ fn receiver_is_dispatchable<'db>( interner, generic_predicates .iter_identity() + .map(Unnormalized::skip_norm_wip) .chain([unsize_predicate.upcast(interner), trait_predicate.upcast(interner)]) .chain(meta_sized_predicate), ), @@ -494,7 +491,7 @@ fn receiver_for_self_ty<'db>( if index == 0 { self_ty.into() } else { mk_param(interner, index, kind) } }); - EarlyBinder::bind(receiver_ty).instantiate(interner, args) + EarlyBinder::bind(receiver_ty).instantiate(interner, args).skip_norm_wip() } fn contains_illegal_impl_trait_in_trait<'db>( @@ -515,11 +512,7 @@ fn contains_illegal_impl_trait_in_trait<'db>( .. }) = ty.kind() { - let id = match def_id { - SolverDefId::InternedOpaqueTyId(id) => id, - _ => unreachable!(), - }; - self.0.insert(id); + self.0.insert(def_id.0); } ty.super_visit_with(self) } |