From b51f44e21b24e0d67d78c1fefad13f7f8e08dc47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Steinbrink?= Date: Sun, 2 Jun 2013 23:27:33 +0200 Subject: [PATCH] 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 --- src/librustc/middle/trans/base.rs | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/librustc/middle/trans/base.rs b/src/librustc/middle/trans/base.rs index 539dc3e1f0009..9b9f80c741b26 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); }