about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMichael Goulet <michael@errs.io>2024-12-14 18:04:09 +0000
committerMichael Goulet <michael@errs.io>2024-12-14 18:05:19 +0000
commitf870761cd861ed222c5573cdd5abb99f4b9ba6d8 (patch)
tree3a79c560cf6f10baa7545bd7caa3fff0b7529109
parentad30caebdd992f04d21351a54e91fa30a69ff0a6 (diff)
downloadrust-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.rs16
-rw-r--r--tests/ui/structs/default-field-values/use-normalized-ty-for-default-struct-value.rs17
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() {}