diff --git a/src/interpreter.rs b/src/interpreter.rs index c8e73e9fb229..6f559e97688e 100644 --- a/src/interpreter.rs +++ b/src/interpreter.rs @@ -269,9 +269,9 @@ impl<'a, 'tcx: 'a> Interpreter<'a, 'tcx> { self.memory.write_int(dest, n) } - fn assign_to_product(&mut self, dest: Pointer, dest_repr: Repr, + fn assign_to_product(&mut self, dest: Pointer, dest_repr: &Repr, operands: &[mir::Operand<'tcx>]) -> EvalResult<()> { - match dest_repr { + match *dest_repr { Repr::Product { ref fields, .. } => { for (field, operand) in fields.iter().zip(operands) { let src = try!(self.operand_to_ptr(operand)); @@ -315,32 +315,26 @@ impl<'a, 'tcx: 'a> Interpreter<'a, 'tcx> { Aggregate(ref kind, ref operands) => { use rustc::mir::repr::AggregateKind::*; match *kind { - Tuple => self.assign_to_product(dest, dest_repr, operands), + Tuple => self.assign_to_product(dest, &dest_repr, operands), - Adt(ref adt_def, variant_idx, _) => { - use rustc::middle::ty::AdtKind::*; - match adt_def.adt_kind() { - Struct => self.assign_to_product(dest, dest_repr, operands), + Adt(ref adt_def, variant_idx, _) => match adt_def.adt_kind() { + ty::AdtKind::Struct => self.assign_to_product(dest, &dest_repr, operands), - Enum => unimplemented!(), + ty::AdtKind::Enum => match dest_repr { + Repr::Sum { discr_size, ref variants, .. } => + // TODO(tsion): Write the discriminant value. + self.assign_to_product( + dest.offset(discr_size), + &variants[variant_idx], + operands + ), + _ => panic!("expected Repr::Sum target"), } - } + }, Vec => unimplemented!(), Closure(..) => unimplemented!(), } - - // let max_fields = adt_def.variants - // .iter() - // .map(|v| v.fields.len()) - // .max() - // .unwrap_or(0); - // let ptr = self.allocate_aggregate(max_fields); - // for (i, operand) in operands.iter().enumerate() { - // let val = self.operand_to_ptr(operand); - // self.write_pointer(ptr.offset(i), val); - // } - // Value::Adt { variant: variant, data_ptr: ptr } } // Ref(_region, _kind, ref lvalue) => { diff --git a/test/sums.rs b/test/sums.rs index bb01e64ae047..e6545e81c00b 100644 --- a/test/sums.rs +++ b/test/sums.rs @@ -1,34 +1,30 @@ #![feature(custom_attribute)] #![allow(dead_code, unused_attributes)] -// enum MyOption { -// Some { data: T }, -// None, -// } - -// #[miri_run(expected = "Int(13)")] -// fn match_my_opt_some() -> i32 { -// let x = MyOption::Some { data: 13 }; -// match x { -// MyOption::Some { data } => data, -// MyOption::None => 42, -// } -// } - -// #[miri_run(expected = "Int(42)")] -// fn match_my_opt_none() -> i32 { -// let x = MyOption::None; -// match x { -// MyOption::Some { data } => data, -// MyOption::None => 42, -// } -// } +#[miri_run] +fn return_none() -> Option { + None +} #[miri_run] -fn match_opt_some() -> i64 { - let x = Some(13); - match x { - Some(data) => data, - None => 42, - } +fn return_some() -> Option { + Some(42) } + +// #[miri_run] +// fn match_opt_none() -> i64 { +// let x = None, +// match x { +// Some(data) => data, +// None => 42, +// } +// } + +// #[miri_run] +// fn match_opt_some() -> i64 { +// let x = Some(13); +// match x { +// Some(data) => data, +// None => 42, +// } +// }