mirror of
https://github.com/rust-lang/rust-analyzer
synced 2024-12-26 21:13:37 +00:00
Auto merge of #17789 - ShoyuVanilla:issue-17191, r=Veykril
fix: Insert a generic arg for `impl Trait` when lowering generic args Fixes #17191 We are not inserting a generic arg when lowering generics like ```rust fn foo<T: B<impl A>(..) { ... } ``` but when we are lowering predicates we do;aa00ddcf65/crates/hir-ty/src/lower.rs (L1697-L1718)
aa00ddcf65/crates/hir-ty/src/lower.rs (L310)
and this mismatch causes index out of bound panic while substituting the predicates
This commit is contained in:
commit
c9109f23de
2 changed files with 24 additions and 0 deletions
|
@ -194,6 +194,11 @@ pub(super) fn lower_generic_args(
|
|||
match generic_arg {
|
||||
ast::GenericArg::TypeArg(type_arg) => {
|
||||
let type_ref = TypeRef::from_ast_opt(lower_ctx, type_arg.ty());
|
||||
type_ref.walk(&mut |tr| {
|
||||
if let TypeRef::ImplTrait(bounds) = tr {
|
||||
lower_ctx.update_impl_traits_bounds(bounds.clone());
|
||||
}
|
||||
});
|
||||
args.push(GenericArg::Type(type_ref));
|
||||
}
|
||||
ast::GenericArg::AssocTypeArg(assoc_type_arg) => {
|
||||
|
|
|
@ -2122,3 +2122,22 @@ fn test() {
|
|||
"#,
|
||||
)
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn issue_17191() {
|
||||
check_types(
|
||||
r#"
|
||||
trait A {
|
||||
type Item;
|
||||
}
|
||||
|
||||
trait B<T> {}
|
||||
|
||||
fn foo<T: B<impl A>>() {}
|
||||
|
||||
fn test() {
|
||||
let f = foo;
|
||||
//^ fn foo<{unknown}>()
|
||||
}"#,
|
||||
);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue