From f7cd07a6158fbbc1760922a95166ce3ede65fee4 Mon Sep 17 00:00:00 2001 From: Scott Olson Date: Sat, 26 Nov 2016 23:20:15 -0800 Subject: [PATCH] Produce PrimValKinds for small, simple layout ADTs. --- src/interpreter/mod.rs | 31 ++++++++++++++++++++++--------- 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/src/interpreter/mod.rs b/src/interpreter/mod.rs index 82b949d453fb..ac2e5cd7967b 100644 --- a/src/interpreter/mod.rs +++ b/src/interpreter/mod.rs @@ -1364,17 +1364,30 @@ impl<'a, 'tcx> EvalContext<'a, 'tcx> { ty::TyAdt(..) => { use rustc::ty::layout::Layout::*; - if let CEnum { discr, signed, .. } = *self.type_layout(ty)? { - let size = discr.size().bytes(); - if signed { - PrimValKind::from_int_size(size) - } else { - PrimValKind::from_uint_size(size) + match *self.type_layout(ty)? { + CEnum { discr, signed, .. } => { + let size = discr.size().bytes(); + if signed { + PrimValKind::from_int_size(size) + } else { + PrimValKind::from_uint_size(size) + } } - } else { - return Err(EvalError::TypeNotPrimitive(ty)); + + RawNullablePointer { value, .. } => { + use rustc::ty::layout::Primitive::*; + match value { + // TODO(solson): Does signedness matter here? What should the sign be? + Int(int) => PrimValKind::from_uint_size(int.size().bytes()), + F32 => PrimValKind::F32, + F64 => PrimValKind::F64, + Pointer => PrimValKind::Ptr, + } + } + + _ => return Err(EvalError::TypeNotPrimitive(ty)), } - }, + } _ => return Err(EvalError::TypeNotPrimitive(ty)), };