diff options
| author | Andy Wang <cbeuw.andy@gmail.com> | 2023-03-20 12:32:38 +0100 |
|---|---|---|
| committer | Andy Wang <cbeuw.andy@gmail.com> | 2023-03-20 15:25:11 +0100 |
| commit | 8e4e55e5246492e7add98ccf24f2f483163cdbf2 (patch) | |
| tree | be560938119813996c7b78e1dbade0bb031be1c9 /compiler/rustc_mir_build/src | |
| parent | ab9bb3ea368b2412531a3e8c07ba73d1dd690134 (diff) | |
| download | rust-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.rs | 25 |
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), ) } |
