Merge pull request #19672 from Veykril/push-tqooypklusty

fix: Fix incorrect diagnostic for lifetime parameter count mismatch
This commit is contained in:
Lukas Wirth 2025-04-23 14:47:40 +00:00 committed by GitHub
commit 3d00e247dd
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 21 additions and 15 deletions

View file

@ -100,6 +100,7 @@ pub(crate) enum GenericArgsPosition {
// 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)]

View file

@ -921,19 +921,19 @@ fn check_generic_args_len(
}
}
// 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 @@ fn check_generic_args_len(
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,

View file

@ -74,17 +74,19 @@ fn foo() {
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 {} }
"#,
);
}

View file

@ -334,6 +334,7 @@ impl ToTokens for Lookup {
}
}
#[allow(clippy::large_enum_variant)]
pub(crate) enum Queries {
TrackedQuery(TrackedQuery),
InputQuery(InputQuery),