diff --git a/src/librustc/middle/trans/base.rs b/src/librustc/middle/trans/base.rs index 539dc3e1f00098f3bc505913894a3456fbae1f51..9b9f80c741b263a55c3580473472660ca09e815a 100644 --- a/src/librustc/middle/trans/base.rs +++ b/src/librustc/middle/trans/base.rs @@ -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 // it doesn't work right with default method impls yet. (FIXME: #2794) if slf.is_owned { - let self_val = PointerCast(bcx, slf.v, - T_ptr(type_of(bcx.ccx(), slf.t))); + let self_val = if datum::appropriate_mode(slf.t).is_by_value() { + 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}); add_clean(bcx, self_val, slf.t); }