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() 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 +