Unnamed repository; edit this file 'description' to name the repository.
Fix invalid index usage in get_constrained_lifetimes_if_type_alias
| -rw-r--r-- | crates/hir-def/src/expr_store/lower.rs | 17 | ||||
| -rw-r--r-- | crates/hir-def/src/expr_store/tests/signatures.rs | 13 |
2 files changed, 24 insertions, 6 deletions
diff --git a/crates/hir-def/src/expr_store/lower.rs b/crates/hir-def/src/expr_store/lower.rs index 6dc1d5d22c..d70ef7ac19 100644 --- a/crates/hir-def/src/expr_store/lower.rs +++ b/crates/hir-def/src/expr_store/lower.rs @@ -3479,12 +3479,17 @@ impl ExprCollector<'_> { let res = constrained_lt_indices .iter() .filter_map(|&idx| { - if let GenericArg::Lifetime(lt_ref) = generic_args.args[idx as usize] - && let LifetimeRef::Named(name) = &self.store.lifetimes[lt_ref] - { - Some(name.clone()) - } else { - None + let lt_ref = generic_args + .args + .iter() + .filter_map(|arg| match arg { + &GenericArg::Lifetime(lt_ref) => Some(lt_ref), + GenericArg::Type(_) | GenericArg::Const(_) => None, + }) + .nth(idx as usize)?; + match &self.store.lifetimes[lt_ref] { + LifetimeRef::Named(name) => Some(name.clone()), + _ => None, } }) .collect(); diff --git a/crates/hir-def/src/expr_store/tests/signatures.rs b/crates/hir-def/src/expr_store/tests/signatures.rs index 24bdc6ece3..460ab6418d 100644 --- a/crates/hir-def/src/expr_store/tests/signatures.rs +++ b/crates/hir-def/src/expr_store/tests/signatures.rs @@ -200,6 +200,19 @@ fn allowed3(baz: impl Baz<Assoc = Qux<impl Foo>>) {} } #[test] +fn type_alias_constrained_lifetime_with_elided_lifetime_args() { + lower_and_print( + r#" +type Alias<'a, 'b, T> = &'b T; +fn f<T>(_: Alias<T>) {} +"#, + expect![[r#" + fn f<T>(Alias::<T>) {...} + "#]], + ); +} + +#[test] fn regression_21138() { lower_and_print( r#" |