about summary refs log tree commit diff
path: root/compiler/rustc_mir_build/src
diff options
context:
space:
mode:
authorAndy Wang <cbeuw.andy@gmail.com>2023-03-20 12:32:38 +0100
committerAndy Wang <cbeuw.andy@gmail.com>2023-03-20 15:25:11 +0100
commit8e4e55e5246492e7add98ccf24f2f483163cdbf2 (patch)
treebe560938119813996c7b78e1dbade0bb031be1c9 /compiler/rustc_mir_build/src
parentab9bb3ea368b2412531a3e8c07ba73d1dd690134 (diff)
downloadrust-8e4e55e5246492e7add98ccf24f2f483163cdbf2.tar.gz
rust-8e4e55e5246492e7add98ccf24f2f483163cdbf2.zip
Support aggregate expressions
Diffstat (limited to 'compiler/rustc_mir_build/src')
-rw-r--r--compiler/rustc_mir_build/src/build/custom/parse/instruction.rs25
1 files changed, 25 insertions, 0 deletions
diff --git a/compiler/rustc_mir_build/src/build/custom/parse/instruction.rs b/compiler/rustc_mir_build/src/build/custom/parse/instruction.rs
index 5e77f2dc126..e60e1a4c815 100644
--- a/compiler/rustc_mir_build/src/build/custom/parse/instruction.rs
+++ b/compiler/rustc_mir_build/src/build/custom/parse/instruction.rs
@@ -166,6 +166,31 @@ impl<'tcx, 'body> ParseCtxt<'tcx, 'body> {
                 let cast_kind = mir_cast_kind(source_ty, expr.ty);
                 Ok(Rvalue::Cast(cast_kind, source, expr.ty))
             },
+            ExprKind::Tuple { fields } => Ok(
+                Rvalue::Aggregate(
+                    Box::new(AggregateKind::Tuple),
+                    fields.iter().map(|e| self.parse_operand(*e)).collect::<Result<_, _>>()?
+                )
+            ),
+            ExprKind::Array { fields } => {
+                let elem_ty = match expr.ty.kind() {
+                    ty::Array(ty, ..) => ty,
+                    _                 => unreachable!("ty is array"),
+                };
+                Ok(Rvalue::Aggregate(
+                    Box::new(AggregateKind::Array(*elem_ty)),
+                    fields.iter().map(|e| self.parse_operand(*e)).collect::<Result<_, _>>()?
+                ))
+            },
+            ExprKind::Adt(box AdtExpr{ adt_def, variant_index, substs, fields, .. }) => {
+                let is_union = adt_def.is_union();
+                let active_field_index = is_union.then(|| fields[0].name.index());
+
+                Ok(Rvalue::Aggregate(
+                    Box::new(AggregateKind::Adt(adt_def.did(), *variant_index, substs, None, active_field_index)),
+                    fields.iter().map(|f| self.parse_operand(f.expr)).collect::<Result<_, _>>()?
+                ))
+            },
             _ => self.parse_operand(expr_id).map(Rvalue::Use),
         )
     }