mirror of
https://github.com/rust-lang/rust.git
synced 2025-06-18 10:38:11 +00:00
Fix passing self by value for types passed by value
For types that are passed by value, we can't just cast the value to a pointer, but have to use an alloca and copy the value there. This handling is already present for all other arguments, but was missing for "self". Fixes #6682, #4850 and #4878
This commit is contained in:
parent
c354a0c7eb
commit
b51f44e21b
@ -1730,8 +1730,15 @@ pub fn copy_args_to_allocas(fcx: fn_ctxt,
|
|||||||
// We really should do this regardless of whether self is owned, but
|
// We really should do this regardless of whether self is owned, but
|
||||||
// it doesn't work right with default method impls yet. (FIXME: #2794)
|
// it doesn't work right with default method impls yet. (FIXME: #2794)
|
||||||
if slf.is_owned {
|
if slf.is_owned {
|
||||||
let self_val = PointerCast(bcx, slf.v,
|
let self_val = if datum::appropriate_mode(slf.t).is_by_value() {
|
||||||
T_ptr(type_of(bcx.ccx(), slf.t)));
|
let tmp = BitCast(bcx, slf.v, type_of(bcx.ccx(), slf.t));
|
||||||
|
let alloc = alloc_ty(bcx, slf.t);
|
||||||
|
Store(bcx, tmp, alloc);
|
||||||
|
alloc
|
||||||
|
} else {
|
||||||
|
PointerCast(bcx, slf.v, T_ptr(type_of(bcx.ccx(), slf.t)))
|
||||||
|
};
|
||||||
|
|
||||||
fcx.llself = Some(ValSelfData {v: self_val, ..slf});
|
fcx.llself = Some(ValSelfData {v: self_val, ..slf});
|
||||||
add_clean(bcx, self_val, slf.t);
|
add_clean(bcx, self_val, slf.t);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user