Merge pull request #19672 from Veykril/push-tqooypklusty
fix: Fix incorrect diagnostic for lifetime parameter count mismatch
diff --git a/crates/hir-ty/src/lower.rs b/crates/hir-ty/src/lower.rs
index 2fb6cdc..073a584 100644
--- a/crates/hir-ty/src/lower.rs
+++ b/crates/hir-ty/src/lower.rs
@@ -100,6 +100,7 @@
// to lowering already include them. We probably can't do that, but we will still need to
// account for them when we properly implement lifetime elision.
FnSignature,
+ OtherSignature,
}
#[derive(Debug)]
diff --git a/crates/hir-ty/src/lower/path.rs b/crates/hir-ty/src/lower/path.rs
index be35816..c89aad8 100644
--- a/crates/hir-ty/src/lower/path.rs
+++ b/crates/hir-ty/src/lower/path.rs
@@ -921,19 +921,19 @@
}
}
+ // FIXME: Function signature lifetime elision has to be considered here once we have it
let infer_lifetimes =
- (position != GenericArgsPosition::Type || infer_args) && provided_lifetimes_count == 0;
+ position != GenericArgsPosition::OtherSignature && provided_lifetimes_count == 0;
- let min_expected_lifetime_args =
- if infer_lifetimes { 0 } else { def_generics.len_lifetimes_self() };
let max_expected_lifetime_args = def_generics.len_lifetimes_self();
- if !(min_expected_lifetime_args..=max_expected_lifetime_args)
- .contains(&provided_lifetimes_count)
+ let min_expected_lifetime_args = if infer_lifetimes { 0 } else { max_expected_lifetime_args };
+ if provided_lifetimes_count < min_expected_lifetime_args
+ || max_expected_lifetime_args < provided_lifetimes_count
{
ctx.report_len_mismatch(
def,
provided_lifetimes_count as u32,
- def_generics.len_lifetimes_self() as u32,
+ max_expected_lifetime_args as u32,
IncorrectGenericsLenKind::Lifetimes,
);
had_error = true;
@@ -950,10 +950,12 @@
TypeOrConstParamData::ConstParamData(_) => true,
})
.count();
+ let expected_max = named_type_and_const_params_count;
let expected_min =
if infer_args { 0 } else { named_type_and_const_params_count - defaults_count };
- let expected_max = named_type_and_const_params_count;
- if !(expected_min..=expected_max).contains(&provided_types_and_consts_count) {
+ if provided_types_and_consts_count < expected_min
+ || expected_max < provided_types_and_consts_count
+ {
ctx.report_len_mismatch(
def,
provided_types_and_consts_count as u32,
diff --git a/crates/ide-diagnostics/src/handlers/incorrect_generics_len.rs b/crates/ide-diagnostics/src/handlers/incorrect_generics_len.rs
index cc4bcd0..8244f303 100644
--- a/crates/ide-diagnostics/src/handlers/incorrect_generics_len.rs
+++ b/crates/ide-diagnostics/src/handlers/incorrect_generics_len.rs
@@ -74,17 +74,19 @@
check_diagnostics(
r#"
struct Foo<'a, 'b>(&'a &'b ());
-struct Bar<'a>(&'a ());
-fn foo() -> Foo {
- let _ = Foo;
- let _ = Foo::<>;
- let _ = Foo::<'static>;
- // ^^^^^^^^^^^ error: this struct takes 2 lifetime arguments but 1 lifetime argument was supplied
+fn foo(Foo(_): Foo) -> Foo {
+ let _: Foo = Foo(&&());
+ let _: Foo::<> = Foo::<>(&&());
+ let _: Foo::<'static>
+ // ^^^^^^^^^^^ error: this struct takes 2 lifetime arguments but 1 lifetime argument was supplied
+ = Foo::<'static>(&&());
+ // ^^^^^^^^^^^ error: this struct takes 2 lifetime arguments but 1 lifetime argument was supplied
+ |_: Foo| -> Foo {loop{}};
+
loop {}
}
-fn bar(_v: Bar) -> Foo { loop {} }
"#,
);
}
diff --git a/crates/query-group-macro/src/queries.rs b/crates/query-group-macro/src/queries.rs
index edbb645..d4d4058 100644
--- a/crates/query-group-macro/src/queries.rs
+++ b/crates/query-group-macro/src/queries.rs
@@ -334,6 +334,7 @@
}
}
+#[allow(clippy::large_enum_variant)]
pub(crate) enum Queries {
TrackedQuery(TrackedQuery),
InputQuery(InputQuery),