diff options
author | Florian Diebold <[email protected]> | 2021-03-24 22:07:54 +0000 |
---|---|---|
committer | Florian Diebold <[email protected]> | 2021-03-24 22:10:13 +0000 |
commit | b4c20e3589372ba1536cec1bfe7de6acd2f40a4d (patch) | |
tree | 18a40f362334376c31afbc41cdd8a304f6b6d23d /crates/hir_ty/src/lower.rs | |
parent | 4a1f5d367db3b5c6ec27d96c96c98b89988c0b3a (diff) |
Fix chalk_ir assertion
Fixes #8150.
Diffstat (limited to 'crates/hir_ty/src/lower.rs')
-rw-r--r-- | crates/hir_ty/src/lower.rs | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/crates/hir_ty/src/lower.rs b/crates/hir_ty/src/lower.rs index 3153b5b74..c87789d45 100644 --- a/crates/hir_ty/src/lower.rs +++ b/crates/hir_ty/src/lower.rs | |||
@@ -828,14 +828,18 @@ pub fn associated_type_shorthand_candidates<R>( | |||
828 | let traits_from_env: Vec<_> = match res { | 828 | let traits_from_env: Vec<_> = match res { |
829 | TypeNs::SelfType(impl_id) => match db.impl_trait(impl_id) { | 829 | TypeNs::SelfType(impl_id) => match db.impl_trait(impl_id) { |
830 | None => vec![], | 830 | None => vec![], |
831 | Some(trait_ref) => vec![trait_ref.value], | 831 | // FIXME: how to correctly handle higher-ranked bounds here? |
832 | Some(trait_ref) => vec![trait_ref.value.shift_bound_vars_out(DebruijnIndex::ONE)], | ||
832 | }, | 833 | }, |
833 | TypeNs::GenericParam(param_id) => { | 834 | TypeNs::GenericParam(param_id) => { |
834 | let predicates = db.generic_predicates_for_param(param_id); | 835 | let predicates = db.generic_predicates_for_param(param_id); |
835 | let mut traits_: Vec<_> = predicates | 836 | let mut traits_: Vec<_> = predicates |
836 | .iter() | 837 | .iter() |
837 | .filter_map(|pred| match &pred.value.value { | 838 | .filter_map(|pred| match &pred.value.value { |
838 | WhereClause::Implemented(tr) => Some(tr.clone()), | 839 | // FIXME: how to correctly handle higher-ranked bounds here? |
840 | WhereClause::Implemented(tr) => { | ||
841 | Some(tr.clone().shift_bound_vars_out(DebruijnIndex::ONE)) | ||
842 | } | ||
839 | _ => None, | 843 | _ => None, |
840 | }) | 844 | }) |
841 | .collect(); | 845 | .collect(); |
@@ -1156,10 +1160,9 @@ fn type_for_type_alias(db: &dyn HirDatabase, t: TypeAliasId) -> Binders<Ty> { | |||
1156 | if db.type_alias_data(t).is_extern { | 1160 | if db.type_alias_data(t).is_extern { |
1157 | Binders::new(0, TyKind::ForeignType(crate::to_foreign_def_id(t)).intern(&Interner)) | 1161 | Binders::new(0, TyKind::ForeignType(crate::to_foreign_def_id(t)).intern(&Interner)) |
1158 | } else { | 1162 | } else { |
1159 | let substs = Substitution::bound_vars(&generics, DebruijnIndex::INNERMOST); | ||
1160 | let type_ref = &db.type_alias_data(t).type_ref; | 1163 | let type_ref = &db.type_alias_data(t).type_ref; |
1161 | let inner = ctx.lower_ty(type_ref.as_ref().unwrap_or(&TypeRef::Error)); | 1164 | let inner = ctx.lower_ty(type_ref.as_ref().unwrap_or(&TypeRef::Error)); |
1162 | Binders::new(substs.len(), inner) | 1165 | Binders::new(generics.len(), inner) |
1163 | } | 1166 | } |
1164 | } | 1167 | } |
1165 | 1168 | ||