From e22cceaceb6210d65c618fdc747d40253eadee86 Mon Sep 17 00:00:00 2001 From: Oliver Schneider Date: Mon, 19 Dec 2016 17:49:51 +0100 Subject: [PATCH] allow using tuple variant names as function handles in presence of NonZero optimizations --- src/terminator/mod.rs | 7 ++++++- ...tuple_like_enum_variant_constructor_pointer_opt.rs | 4 ++++ ...ike_enum_variant_constructor_struct_pointer_opt.rs | 11 +++++++++++ 3 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 tests/run-pass/tuple_like_enum_variant_constructor_pointer_opt.rs create mode 100644 tests/run-pass/tuple_like_enum_variant_constructor_struct_pointer_opt.rs diff --git a/src/terminator/mod.rs b/src/terminator/mod.rs index bd1c85accd58..bd93bd53a497 100644 --- a/src/terminator/mod.rs +++ b/src/terminator/mod.rs @@ -258,7 +258,12 @@ impl<'a, 'tcx> EvalContext<'a, 'tcx> { discr_size, )?; }, - // FIXME: raw nullable pointer constructors + Layout::StructWrappedNullablePointer { .. } | + Layout::RawNullablePointer { .. } => { + assert_eq!(args.len(), 1); + let (val, ty) = args.pop().unwrap(); + self.write_value(val, lvalue, ty)?; + }, _ => bug!("bad layout for tuple struct constructor: {:?}", dest_layout), } self.goto_block(target); diff --git a/tests/run-pass/tuple_like_enum_variant_constructor_pointer_opt.rs b/tests/run-pass/tuple_like_enum_variant_constructor_pointer_opt.rs new file mode 100644 index 000000000000..fb57d4f4c165 --- /dev/null +++ b/tests/run-pass/tuple_like_enum_variant_constructor_pointer_opt.rs @@ -0,0 +1,4 @@ +fn main() { + let x = 5; + assert_eq!(Some(&x).map(Some), Some(Some(&x))); +} diff --git a/tests/run-pass/tuple_like_enum_variant_constructor_struct_pointer_opt.rs b/tests/run-pass/tuple_like_enum_variant_constructor_struct_pointer_opt.rs new file mode 100644 index 000000000000..e61e4af5753a --- /dev/null +++ b/tests/run-pass/tuple_like_enum_variant_constructor_struct_pointer_opt.rs @@ -0,0 +1,11 @@ +#[derive(Copy, Clone, PartialEq, Debug)] +struct A<'a> { + x: i32, + y: &'a i32, +} + +fn main() { + let x = 5; + let a = A { x: 99, y: &x }; + assert_eq!(Some(a).map(Some), Some(Some(a))); +}