aboutsummaryrefslogtreecommitdiff
path: root/crates/hir_ty/src/lower.rs
diff options
context:
space:
mode:
authorFlorian Diebold <[email protected]>2021-03-24 22:07:54 +0000
committerFlorian Diebold <[email protected]>2021-03-24 22:10:13 +0000
commitb4c20e3589372ba1536cec1bfe7de6acd2f40a4d (patch)
tree18a40f362334376c31afbc41cdd8a304f6b6d23d /crates/hir_ty/src/lower.rs
parent4a1f5d367db3b5c6ec27d96c96c98b89988c0b3a (diff)
Fix chalk_ir assertion
Fixes #8150.
Diffstat (limited to 'crates/hir_ty/src/lower.rs')
-rw-r--r--crates/hir_ty/src/lower.rs11
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