diff options
| author | bors <bors@rust-lang.org> | 2024-08-04 19:13:40 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2024-08-04 19:13:40 +0000 |
| commit | 77fe1cb96c1cdccd0844137014386a6ada84e633 (patch) | |
| tree | 4f518b9fdc3e6252fe4a279a328ddaba357b3943 | |
| parent | 6da26c15580d5c41ee2bb29ae4372b8c52f96174 (diff) | |
| parent | fbe7233c0a17d23b0035112259a7b37cda2d419b (diff) | |
| download | rust-77fe1cb96c1cdccd0844137014386a6ada84e633.tar.gz rust-77fe1cb96c1cdccd0844137014386a6ada84e633.zip | |
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;
https://github.com/rust-lang/rust-analyzer/blob/aa00ddcf654a35ba0eafe17247cf189958d33182/crates/hir-ty/src/lower.rs#L1697-L1718
https://github.com/rust-lang/rust-analyzer/blob/aa00ddcf654a35ba0eafe17247cf189958d33182/crates/hir-ty/src/lower.rs#L310
and this mismatch causes index out of bound panic while substituting the predicates
| -rw-r--r-- | src/tools/rust-analyzer/crates/hir-def/src/path/lower.rs | 5 | ||||
| -rw-r--r-- | src/tools/rust-analyzer/crates/hir-ty/src/tests/regression.rs | 19 |
2 files changed, 24 insertions, 0 deletions
diff --git a/src/tools/rust-analyzer/crates/hir-def/src/path/lower.rs b/src/tools/rust-analyzer/crates/hir-def/src/path/lower.rs index 7c39773aa68..70918a9358e 100644 --- a/src/tools/rust-analyzer/crates/hir-def/src/path/lower.rs +++ b/src/tools/rust-analyzer/crates/hir-def/src/path/lower.rs @@ -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) => { diff --git a/src/tools/rust-analyzer/crates/hir-ty/src/tests/regression.rs b/src/tools/rust-analyzer/crates/hir-ty/src/tests/regression.rs index ac2dfea1010..28198386120 100644 --- a/src/tools/rust-analyzer/crates/hir-ty/src/tests/regression.rs +++ b/src/tools/rust-analyzer/crates/hir-ty/src/tests/regression.rs @@ -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}>() +}"#, + ); +} |
