diff --git a/src/librustc_trans/mir/mod.rs b/src/librustc_trans/mir/mod.rs index d1206550b13d6..408b30c72582c 100644 --- a/src/librustc_trans/mir/mod.rs +++ b/src/librustc_trans/mir/mod.rs @@ -124,7 +124,12 @@ impl<'tcx> TempRef<'tcx> { // Zero-size temporaries aren't always initialized, which // doesn't matter because they don't contain data, but // we need something in the operand. - let val = OperandValue::Immediate(common::C_nil(ccx)); + let nil = common::C_nil(ccx); + let val = if common::type_is_imm_pair(ccx, ty) { + OperandValue::Pair(nil, nil) + } else { + OperandValue::Immediate(nil) + }; let op = OperandRef { val: val, ty: ty diff --git a/src/test/run-pass/mir_trans_calls.rs b/src/test/run-pass/mir_trans_calls.rs index 31e2c8925711c..0527f38a9c36d 100644 --- a/src/test/run-pass/mir_trans_calls.rs +++ b/src/test/run-pass/mir_trans_calls.rs @@ -147,6 +147,16 @@ fn test_fn_transmute_zst(x: ()) -> [(); 1] { }) } +#[rustc_mir] +fn test_fn_ignored_pair() -> ((), ()) { + ((), ()) +} + +#[rustc_mir] +fn test_fn_ignored_pair_0() { + test_fn_ignored_pair().0 +} + fn main() { assert_eq!(test1(1, (2, 3), &[4, 5, 6]), (1, (2, 3), &[4, 5, 6][..])); assert_eq!(test2(98), 98); @@ -169,4 +179,6 @@ fn main() { assert_eq!(test_fn_nil_call(&(|| 42)), 42); assert_eq!(test_fn_transmute_zst(()), [()]); + + assert_eq!(test_fn_ignored_pair_0(), ()); }