about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorPatrick Walton <pcwalton@mimiga.net>2011-09-30 12:07:50 -0700
committerPatrick Walton <pcwalton@mimiga.net>2011-09-30 12:07:50 -0700
commitdcf0e807fbc46142859d0b0b0de0bfba4edce4c8 (patch)
tree6d9368395f1b2fb16cb7eeb02567e4cf513ce183 /src
parent472dd71fea8d1bb99e3c896d149323ab88cc1344 (diff)
trans: Use inttoptr as appropriate when casting return values of C stack functions
Diffstat (limited to 'src')
-rw-r--r--src/comp/middle/trans.rs10
1 files changed, 9 insertions, 1 deletions
diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs
index ba2deb152ca..a22fec2fd60 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);