Skip to content

Commit 3bd42d3

Browse files
committed
Auto merge of rust-lang#17948 - ShoyuVanilla:parent-self-sized, r=Veykril
fix: Wrong `Self: Sized` predicate for trait assoc items Again while implementing object safety like rust-lang#17939 😅 If we call `generic_predicates_query` on `fn foo` in the following code; ``` trait Foo { fn foo(); } ``` It returns implicit bound `Self: Sized`, even though `Self` is not appearing as a generic parameter inside angle brackets, but as a parent generic parameter, "trait self". This PR prevent pushing "implicit" `Self: Sized` predicates in such cases
2 parents 3a097e1 + eb896a5 commit 3bd42d3

File tree

1 file changed

+32
-8
lines changed
  • src/tools/rust-analyzer/crates/hir-ty/src

1 file changed

+32
-8
lines changed

src/tools/rust-analyzer/crates/hir-ty/src/lower.rs

Lines changed: 32 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1743,24 +1743,48 @@ fn implicitly_sized_clauses<'a, 'subst: 'a>(
17431743
substitution: &'subst Substitution,
17441744
resolver: &Resolver,
17451745
) -> Option<impl Iterator<Item = WhereClause> + Captures<'a> + Captures<'subst>> {
1746-
let is_trait_def = matches!(def, GenericDefId::TraitId(..));
1747-
let generic_args = &substitution.as_slice(Interner)[is_trait_def as usize..];
17481746
let sized_trait = db
17491747
.lang_item(resolver.krate(), LangItem::Sized)
1750-
.and_then(|lang_item| lang_item.as_trait().map(to_chalk_trait_id));
1748+
.and_then(|lang_item| lang_item.as_trait().map(to_chalk_trait_id))?;
17511749

1752-
sized_trait.map(move |sized_trait| {
1753-
generic_args
1754-
.iter()
1750+
let get_trait_self_idx = |container: ItemContainerId| {
1751+
if matches!(container, ItemContainerId::TraitId(_)) {
1752+
let generics = generics(db.upcast(), def);
1753+
Some(generics.len_self())
1754+
} else {
1755+
None
1756+
}
1757+
};
1758+
let trait_self_idx = match def {
1759+
GenericDefId::TraitId(_) => Some(0),
1760+
GenericDefId::FunctionId(it) => get_trait_self_idx(it.lookup(db.upcast()).container),
1761+
GenericDefId::ConstId(it) => get_trait_self_idx(it.lookup(db.upcast()).container),
1762+
GenericDefId::TypeAliasId(it) => get_trait_self_idx(it.lookup(db.upcast()).container),
1763+
_ => None,
1764+
};
1765+
1766+
Some(
1767+
substitution
1768+
.iter(Interner)
1769+
.enumerate()
1770+
.filter_map(
1771+
move |(idx, generic_arg)| {
1772+
if Some(idx) == trait_self_idx {
1773+
None
1774+
} else {
1775+
Some(generic_arg)
1776+
}
1777+
},
1778+
)
17551779
.filter_map(|generic_arg| generic_arg.ty(Interner))
17561780
.filter(move |&self_ty| !explicitly_unsized_tys.contains(self_ty))
17571781
.map(move |self_ty| {
17581782
WhereClause::Implemented(TraitRef {
17591783
trait_id: sized_trait,
17601784
substitution: Substitution::from1(Interner, self_ty.clone()),
17611785
})
1762-
})
1763-
})
1786+
}),
1787+
)
17641788
}
17651789

17661790
#[derive(Debug, Clone, PartialEq, Eq, Hash)]

0 commit comments

Comments
 (0)