Auto merge of #29583 - dotdash:mir_small_agg, r=nikomatsakis
Fix handling of small aggregate function arguments and assignments of temporaries to lvalues.
This commit is contained in:
commit
96c95f160f
src
@ -169,7 +169,7 @@ fn arg_value_refs<'bcx, 'tcx>(bcx: Block<'bcx, 'tcx>,
|
||||
idx += 2;
|
||||
let lltemp = base::alloc_ty(bcx, arg_ty, &format!("arg{}", arg_index));
|
||||
build::Store(bcx, lldata, expr::get_dataptr(bcx, lltemp));
|
||||
build::Store(bcx, llextra, expr::get_dataptr(bcx, lltemp));
|
||||
build::Store(bcx, llextra, expr::get_meta(bcx, lltemp));
|
||||
lltemp
|
||||
} else {
|
||||
// otherwise, arg is passed by value, so make a
|
||||
@ -177,7 +177,7 @@ fn arg_value_refs<'bcx, 'tcx>(bcx: Block<'bcx, 'tcx>,
|
||||
let llarg = llvm::get_param(fcx.llfn, idx);
|
||||
idx += 1;
|
||||
let lltemp = base::alloc_ty(bcx, arg_ty, &format!("arg{}", arg_index));
|
||||
build::Store(bcx, llarg, lltemp);
|
||||
base::store_ty(bcx, llarg, lltemp, arg_ty);
|
||||
lltemp
|
||||
};
|
||||
LvalueRef::new(llval, LvalueTy::from_ty(arg_ty))
|
||||
|
@ -92,19 +92,10 @@ impl<'bcx, 'tcx> MirContext<'bcx, 'tcx> {
|
||||
bcx.val_to_string(lldest),
|
||||
operand);
|
||||
|
||||
match *operand {
|
||||
mir::Operand::Consume(ref lvalue) => {
|
||||
let tr_lvalue = self.trans_lvalue(bcx, lvalue);
|
||||
let lvalue_ty = tr_lvalue.ty.to_ty(bcx.tcx());
|
||||
debug!("trans_operand_into: tr_lvalue={} @ {:?}",
|
||||
bcx.val_to_string(tr_lvalue.llval),
|
||||
lvalue_ty);
|
||||
base::memcpy_ty(bcx, lldest, tr_lvalue.llval, lvalue_ty);
|
||||
}
|
||||
|
||||
mir::Operand::Constant(..) => {
|
||||
unimplemented!()
|
||||
}
|
||||
}
|
||||
let o = self.trans_operand(bcx, operand);
|
||||
match datum::appropriate_rvalue_mode(bcx.ccx(), o.ty) {
|
||||
datum::ByValue => base::store_ty(bcx, o.llval, lldest, o.ty),
|
||||
datum::ByRef => base::memcpy_ty(bcx, lldest, o.llval, o.ty),
|
||||
};
|
||||
}
|
||||
}
|
||||
|
19
src/test/run-pass/mir_small_agg_arg.rs
Normal file
19
src/test/run-pass/mir_small_agg_arg.rs
Normal file
@ -0,0 +1,19 @@
|
||||
// Copyright 2015 The Rust Project Developers. See the COPYRIGHT
|
||||
// file at the top-level directory of this distribution and at
|
||||
// http://rust-lang.org/COPYRIGHT.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
#![feature(rustc_attrs)]
|
||||
|
||||
#[rustc_mir]
|
||||
fn foo((x, y): (i8, i8)) {
|
||||
}
|
||||
|
||||
fn main() {
|
||||
foo((0, 1));
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user