From b31dc4ab495c0297c4f09324094e9c8e62d52977 Mon Sep 17 00:00:00 2001 From: Usman Akinyemi Date: Sat, 21 Mar 2026 21:45:57 +0530 Subject: [PATCH] diagnostics: avoid ICE for undeclared generic parameter in impl Avoid an ICE for: struct A; impl A {} The compiler no longer panics and can proceed to emit existing diagnostics. Adds `tests/ui/missing/undeclared-generic-parameter.rs`. Signed-off-by: Usman Akinyemi --- .../rustc_resolve/src/late/diagnostics.rs | 2 +- .../missing/undeclared-generic-parameter.rs | 5 +++ .../undeclared-generic-parameter.stderr | 36 +++++++++++++++++++ 3 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 tests/ui/missing/undeclared-generic-parameter.rs create mode 100644 tests/ui/missing/undeclared-generic-parameter.stderr diff --git a/compiler/rustc_resolve/src/late/diagnostics.rs b/compiler/rustc_resolve/src/late/diagnostics.rs index e24389e0d74df..713d6eb74bcba 100644 --- a/compiler/rustc_resolve/src/late/diagnostics.rs +++ b/compiler/rustc_resolve/src/late/diagnostics.rs @@ -3381,7 +3381,7 @@ impl<'ast, 'ra, 'tcx> LateResolutionVisitor<'_, 'ast, 'ra, 'tcx> { && def_id.is_local() && let Some(local_def_id) = def_id.as_local() && let Some(struct_generics) = self.r.struct_generics.get(&local_def_id) - && let target_param = &struct_generics.params[idx] + && let Some(target_param) = &struct_generics.params.get(idx) && let GenericParamKind::Const { ty, .. } = &target_param.kind && let TyKind::Path(_, path) = &ty.kind { diff --git a/tests/ui/missing/undeclared-generic-parameter.rs b/tests/ui/missing/undeclared-generic-parameter.rs new file mode 100644 index 0000000000000..eebae215c8813 --- /dev/null +++ b/tests/ui/missing/undeclared-generic-parameter.rs @@ -0,0 +1,5 @@ +struct A; +impl A {} +//~^ ERROR cannot find type `B` in this scope +//~| ERROR struct takes 0 generic arguments but 1 generic argument was supplied +fn main() {} diff --git a/tests/ui/missing/undeclared-generic-parameter.stderr b/tests/ui/missing/undeclared-generic-parameter.stderr new file mode 100644 index 0000000000000..101a5790ed4e6 --- /dev/null +++ b/tests/ui/missing/undeclared-generic-parameter.stderr @@ -0,0 +1,36 @@ +error[E0425]: cannot find type `B` in this scope + --> $DIR/undeclared-generic-parameter.rs:2:8 + | +LL | struct A; + | --------- similarly named struct `A` defined here +LL | impl A {} + | ^ + | +help: a struct with a similar name exists + | +LL - impl A {} +LL + impl A {} + | +help: you might be missing a type parameter + | +LL | impl A {} + | +++ + +error[E0107]: struct takes 0 generic arguments but 1 generic argument was supplied + --> $DIR/undeclared-generic-parameter.rs:2:6 + | +LL | impl A {} + | ^--- help: remove the unnecessary generics + | | + | expected 0 generic arguments + | +note: struct defined here, with 0 generic parameters + --> $DIR/undeclared-generic-parameter.rs:1:8 + | +LL | struct A; + | ^ + +error: aborting due to 2 previous errors + +Some errors have detailed explanations: E0107, E0425. +For more information about an error, try `rustc --explain E0107`.