diff options
| author | Michael Goulet <michael@errs.io> | 2024-12-14 18:04:09 +0000 |
|---|---|---|
| committer | Michael Goulet <michael@errs.io> | 2024-12-14 18:05:19 +0000 |
| commit | f870761cd861ed222c5573cdd5abb99f4b9ba6d8 (patch) | |
| tree | 3a79c560cf6f10baa7545bd7caa3fff0b7529109 | |
| parent | ad30caebdd992f04d21351a54e91fa30a69ff0a6 (diff) | |
| download | rust-f870761cd861ed222c5573cdd5abb99f4b9ba6d8.tar.gz rust-f870761cd861ed222c5573cdd5abb99f4b9ba6d8.zip | |
Make sure to use normalized ty for unevaluated const for default struct value
| -rw-r--r-- | compiler/rustc_mir_build/src/build/expr/into.rs | 16 | ||||
| -rw-r--r-- | tests/ui/structs/default-field-values/use-normalized-ty-for-default-struct-value.rs | 17 |
2 files changed, 28 insertions, 5 deletions
diff --git a/compiler/rustc_mir_build/src/build/expr/into.rs b/compiler/rustc_mir_build/src/build/expr/into.rs index a3d5376dcd4..0ac1ae56d59 100644 --- a/compiler/rustc_mir_build/src/build/expr/into.rs +++ b/compiler/rustc_mir_build/src/build/expr/into.rs @@ -367,14 +367,20 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { .collect() } AdtExprBase::DefaultFields(field_types) => { - itertools::zip_eq(field_names, &**field_types) - .map(|(n, ty)| match fields_map.get(&n) { + itertools::zip_eq(field_names, field_types) + .map(|(n, &ty)| match fields_map.get(&n) { Some(v) => v.clone(), None => match variant.fields[n].value { Some(def) => { - let value = Const::from_unevaluated(this.tcx, def) - .instantiate(this.tcx, args); - this.literal_operand(expr_span, value) + let value = Const::Unevaluated( + UnevaluatedConst::new(def, args), + ty, + ); + Operand::Constant(Box::new(ConstOperand { + span: expr_span, + user_ty: None, + const_: value, + })) } None => { let name = variant.fields[n].name; diff --git a/tests/ui/structs/default-field-values/use-normalized-ty-for-default-struct-value.rs b/tests/ui/structs/default-field-values/use-normalized-ty-for-default-struct-value.rs new file mode 100644 index 00000000000..bb14524608d --- /dev/null +++ b/tests/ui/structs/default-field-values/use-normalized-ty-for-default-struct-value.rs @@ -0,0 +1,17 @@ +//@ check-pass + +#![feature(default_field_values)] + +struct Value<const VALUE: u8>; + +impl<const VALUE: u8> Value<VALUE> { + pub const VALUE: Self = Self; +} + +pub struct WithUse { + _use: Value<{ 0 + 0 }> = Value::VALUE +} + +const _: WithUse = WithUse { .. }; + +fn main() {} |
