diff --git a/crates/hir-ty/src/lower.rs b/crates/hir-ty/src/lower.rs index 2fb6cdc02a76..073a584d8dd6 100644 --- a/crates/hir-ty/src/lower.rs +++ b/crates/hir-ty/src/lower.rs @@ -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)] diff --git a/crates/hir-ty/src/lower/path.rs b/crates/hir-ty/src/lower/path.rs index be3581639918..c89aad87f791 100644 --- a/crates/hir-ty/src/lower/path.rs +++ b/crates/hir-ty/src/lower/path.rs @@ -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, diff --git a/crates/ide-diagnostics/src/handlers/incorrect_generics_len.rs b/crates/ide-diagnostics/src/handlers/incorrect_generics_len.rs index cc4bcd02b820..8244f303d964 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 @@ 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 {} } "#, ); } diff --git a/crates/query-group-macro/src/queries.rs b/crates/query-group-macro/src/queries.rs index edbb645bf421..d4d40588bfc7 100644 --- a/crates/query-group-macro/src/queries.rs +++ b/crates/query-group-macro/src/queries.rs @@ -334,6 +334,7 @@ impl ToTokens for Lookup { } } +#[allow(clippy::large_enum_variant)] pub(crate) enum Queries { TrackedQuery(TrackedQuery), InputQuery(InputQuery),