From dcf0e807fbc46142859d0b0b0de0bfba4edce4c8 Mon Sep 17 00:00:00 2001 From: Patrick Walton Date: Fri, 30 Sep 2011 12:07:50 -0700 Subject: [PATCH] trans: Use inttoptr as appropriate when casting return values of C stack functions --- src/comp/middle/trans.rs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs index ba2deb152ca6..a22fec2fd603 100644 --- a/src/comp/middle/trans.rs +++ b/src/comp/middle/trans.rs @@ -4029,7 +4029,15 @@ fn trans_c_stack_native_call(bcx: @block_ctxt, f: @ast::expr, let ret_ty = ty::ty_fn_ret(bcx_tcx(bcx), fn_ty); check type_has_static_size(ccx, ret_ty); let llretty = type_of(ccx, f.span, ret_ty); - let llretval = TruncOrBitCast(bcx, llrawretval, llretty); + log_err "casting " + val_str(ccx.tn, llrawretval) + " to " + + lib::llvm::type_to_str(ccx.tn, llretty); + + let llretval; + if lib::llvm::llvm::LLVMGetTypeKind(llretty) as int == 11 { // pointer + llretval = IntToPtr(bcx, llrawretval, llretty); + } else { + llretval = TruncOrBitCast(bcx, llrawretval, llretty); + } // Forget about anything we moved out. bcx = zero_and_revoke(bcx, to_zero, to_revoke);