From 8da99a099a1fc9c0318c3221546eac40b3b423cb Mon Sep 17 00:00:00 2001 From: bit-aloo Date: Sun, 14 Jun 2026 17:55:23 +0530 Subject: [PATCH 1/3] add test to show extra field in mgca adt const arg --- .../mgca/adt_expr_unit_struct_extra_field.rs | 11 +++++++++++ .../mgca/adt_expr_unit_struct_extra_field.stderr | 8 ++++++++ 2 files changed, 19 insertions(+) create mode 100644 tests/ui/const-generics/mgca/adt_expr_unit_struct_extra_field.rs create mode 100644 tests/ui/const-generics/mgca/adt_expr_unit_struct_extra_field.stderr diff --git a/tests/ui/const-generics/mgca/adt_expr_unit_struct_extra_field.rs b/tests/ui/const-generics/mgca/adt_expr_unit_struct_extra_field.rs new file mode 100644 index 0000000000000..2858f6ba93bc9 --- /dev/null +++ b/tests/ui/const-generics/mgca/adt_expr_unit_struct_extra_field.rs @@ -0,0 +1,11 @@ +#![feature(min_generic_const_args, adt_const_params)] + +#[derive(Eq, PartialEq, std::marker::ConstParamTy)] +struct Foo; + +fn foo() {} + +fn main() { + foo::<{ Foo { field: const { 1 } } }>(); + //~^ ERROR struct expression has no field named `field` +} diff --git a/tests/ui/const-generics/mgca/adt_expr_unit_struct_extra_field.stderr b/tests/ui/const-generics/mgca/adt_expr_unit_struct_extra_field.stderr new file mode 100644 index 0000000000000..21eea71ea53fa --- /dev/null +++ b/tests/ui/const-generics/mgca/adt_expr_unit_struct_extra_field.stderr @@ -0,0 +1,8 @@ +error: struct expression has no field named `field` + --> $DIR/adt_expr_unit_struct_extra_field.rs:9:19 + | +LL | foo::<{ Foo { field: const { 1 } } }>(); + | ^^^^^ + +error: aborting due to 1 previous error + From 86efd4bf14a491257be585a84c7f99cd26ba1de1 Mon Sep 17 00:00:00 2001 From: bit-aloo Date: Sun, 14 Jun 2026 17:56:09 +0530 Subject: [PATCH 2/3] make sure check if there are extra fields or not. --- compiler/rustc_hir_analysis/src/hir_ty_lowering/mod.rs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/compiler/rustc_hir_analysis/src/hir_ty_lowering/mod.rs b/compiler/rustc_hir_analysis/src/hir_ty_lowering/mod.rs index 7909fdbf2365e..9968dfafc90dc 100644 --- a/compiler/rustc_hir_analysis/src/hir_ty_lowering/mod.rs +++ b/compiler/rustc_hir_analysis/src/hir_ty_lowering/mod.rs @@ -2591,6 +2591,16 @@ impl<'tcx> dyn HirTyLowerer<'tcx> + '_ { let variant_def = adt_def.variant_with_id(variant_did); let variant_idx = adt_def.variant_index_with_id(variant_did).as_u32(); + for init in inits { + if !variant_def.fields.iter().any(|field_def| field_def.name == init.field.name) { + let err = tcx.dcx().struct_span_err( + init.field.span, + format!("struct expression has no field named `{}`", init.field), + ); + return ty::Const::new_error(tcx, err.emit()); + } + } + let fields = variant_def .fields .iter() From 84b803ed57a7b14445ce4869426fc5b6ebbf69ba Mon Sep 17 00:00:00 2001 From: bit-aloo Date: Tue, 16 Jun 2026 18:54:36 +0530 Subject: [PATCH 3/3] improve diagnostics and mentions struct and not expression --- compiler/rustc_hir_analysis/src/hir_ty_lowering/mod.rs | 2 +- .../ui/const-generics/mgca/adt_expr_unit_struct_extra_field.rs | 2 +- .../const-generics/mgca/adt_expr_unit_struct_extra_field.stderr | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/compiler/rustc_hir_analysis/src/hir_ty_lowering/mod.rs b/compiler/rustc_hir_analysis/src/hir_ty_lowering/mod.rs index 9968dfafc90dc..73438a9f9d94f 100644 --- a/compiler/rustc_hir_analysis/src/hir_ty_lowering/mod.rs +++ b/compiler/rustc_hir_analysis/src/hir_ty_lowering/mod.rs @@ -2595,7 +2595,7 @@ impl<'tcx> dyn HirTyLowerer<'tcx> + '_ { if !variant_def.fields.iter().any(|field_def| field_def.name == init.field.name) { let err = tcx.dcx().struct_span_err( init.field.span, - format!("struct expression has no field named `{}`", init.field), + format!("struct `{}` has no field named `{}`", variant_def.name, init.field), ); return ty::Const::new_error(tcx, err.emit()); } diff --git a/tests/ui/const-generics/mgca/adt_expr_unit_struct_extra_field.rs b/tests/ui/const-generics/mgca/adt_expr_unit_struct_extra_field.rs index 2858f6ba93bc9..b422e94b81e3d 100644 --- a/tests/ui/const-generics/mgca/adt_expr_unit_struct_extra_field.rs +++ b/tests/ui/const-generics/mgca/adt_expr_unit_struct_extra_field.rs @@ -7,5 +7,5 @@ fn foo() {} fn main() { foo::<{ Foo { field: const { 1 } } }>(); - //~^ ERROR struct expression has no field named `field` + //~^ ERROR struct `Foo` has no field named `field` } diff --git a/tests/ui/const-generics/mgca/adt_expr_unit_struct_extra_field.stderr b/tests/ui/const-generics/mgca/adt_expr_unit_struct_extra_field.stderr index 21eea71ea53fa..369420b0b0384 100644 --- a/tests/ui/const-generics/mgca/adt_expr_unit_struct_extra_field.stderr +++ b/tests/ui/const-generics/mgca/adt_expr_unit_struct_extra_field.stderr @@ -1,4 +1,4 @@ -error: struct expression has no field named `field` +error: struct `Foo` has no field named `field` --> $DIR/adt_expr_unit_struct_extra_field.rs:9:19 | LL | foo::<{ Foo { field: const { 1 } } }>();