diff options
| author | Eduard Burtescu <edy.burt@gmail.com> | 2016-06-09 00:33:57 +0300 |
|---|---|---|
| committer | Eduard Burtescu <edy.burt@gmail.com> | 2016-06-09 00:33:57 +0300 |
| commit | 22fa769bc45da67dd6a8a60c4f9ae8b9f7e54e29 (patch) | |
| tree | 1d3ac7ab035912c620f84205f04676df0880379f /src | |
| parent | 368f6ae8cb03c0986d30af704b64c58a2b87dfe4 (diff) | |
trans: don't misuse C_nil for ZSTs other than ().
Diffstat (limited to 'src')
| -rw-r--r-- | src/librustc_trans/mir/mod.rs | 9 | ||||
| -rw-r--r-- | src/test/run-pass/mir_trans_calls.rs | 15 |
2 files changed, 20 insertions, 4 deletions
diff --git a/src/librustc_trans/mir/mod.rs b/src/librustc_trans/mir/mod.rs index 0e700d61194..b414e3435bf 100644 --- a/src/librustc_trans/mir/mod.rs +++ b/src/librustc_trans/mir/mod.rs @@ -16,7 +16,7 @@ use rustc::mir::repr as mir; use rustc::mir::tcx::LvalueTy; use session::config::FullDebugInfo; use base; -use common::{self, Block, BlockAndBuilder, CrateContext, FunctionContext}; +use common::{self, Block, BlockAndBuilder, CrateContext, FunctionContext, C_null}; use debuginfo::{self, declare_local, DebugLoc, VariableAccess, VariableKind}; use machine; use type_of; @@ -124,11 +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 nil = common::C_nil(ccx); + let llty = type_of::type_of(ccx, ty); let val = if common::type_is_imm_pair(ccx, ty) { - OperandValue::Pair(nil, nil) + let fields = llty.field_types(); + OperandValue::Pair(C_null(fields[0]), C_null(fields[1])) } else { - OperandValue::Immediate(nil) + OperandValue::Immediate(C_null(llty)) }; let op = OperandRef { val: val, diff --git a/src/test/run-pass/mir_trans_calls.rs b/src/test/run-pass/mir_trans_calls.rs index 0527f38a9c3..2371909b31b 100644 --- a/src/test/run-pass/mir_trans_calls.rs +++ b/src/test/run-pass/mir_trans_calls.rs @@ -30,6 +30,7 @@ fn test2(a: isize) -> isize { callee(a) } +#[derive(PartialEq, Eq, Debug)] struct Foo; impl Foo { fn inherent_method(&self, a: isize) -> isize { a } @@ -157,6 +158,19 @@ fn test_fn_ignored_pair_0() { test_fn_ignored_pair().0 } +#[rustc_mir] +fn id<T>(x: T) -> T { x } + +#[rustc_mir] +fn ignored_pair_named() -> (Foo, Foo) { + (Foo, Foo) +} + +#[rustc_mir] +fn test_fn_ignored_pair_named() -> (Foo, Foo) { + id(ignored_pair_named()) +} + fn main() { assert_eq!(test1(1, (2, 3), &[4, 5, 6]), (1, (2, 3), &[4, 5, 6][..])); assert_eq!(test2(98), 98); @@ -181,4 +195,5 @@ fn main() { assert_eq!(test_fn_transmute_zst(()), [()]); assert_eq!(test_fn_ignored_pair_0(), ()); + assert_eq!(test_fn_ignored_pair_named(), (Foo, Foo)); } |
