Unnamed repository; edit this file 'description' to name the repository.
Fix invalid index usage in get_constrained_lifetimes_if_type_alias
Lukas Wirth 4 weeks ago
parent 5f0eb33 · commit 588c4e7
-rw-r--r--crates/hir-def/src/expr_store/lower.rs17
-rw-r--r--crates/hir-def/src/expr_store/tests/signatures.rs13
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#"