diff --git a/src/librustc/middle/trans/cabi.rs b/src/librustc/middle/trans/cabi.rs index 41b812c8e14d..ed028d14bd65 100644 --- a/src/librustc/middle/trans/cabi.rs +++ b/src/librustc/middle/trans/cabi.rs @@ -13,7 +13,6 @@ use middle::trans::base::*; use middle::trans::build::*; use middle::trans::common::*; -use core::io::println; use core::libc::c_uint; use core::option; use core::vec; diff --git a/src/librustc/middle/trans/foreign.rs b/src/librustc/middle/trans/foreign.rs index b00f4d8ed42c..86ce556be723 100644 --- a/src/librustc/middle/trans/foreign.rs +++ b/src/librustc/middle/trans/foreign.rs @@ -185,17 +185,19 @@ fn build_wrap_fn_(ccx: @CrateContext, llshimfn: ValueRef, llwrapfn: ValueRef, shim_upcall: ValueRef, + needs_c_return: bool, arg_builder: wrap_arg_builder, ret_builder: wrap_ret_builder) { let _icx = ccx.insn_ctxt("foreign::build_wrap_fn_"); let fcx = new_fn_ctxt(ccx, ~[], llwrapfn, tys.fn_sig.output, None); - // Patch up the return type if it's not immediate. - /*if !ty::type_is_immediate(tys.fn_sig.output) { + // Patch up the return type if it's not immediate and we're returning via + // the C ABI. + if needs_c_return && !ty::type_is_immediate(tys.fn_sig.output) { let lloutputtype = type_of::type_of(*fcx.ccx, tys.fn_sig.output); fcx.llretptr = Some(alloca(raw_block(fcx, false, fcx.llstaticallocas), lloutputtype)); - }*/ + } let bcx = top_scope_block(fcx, None); let lltop = bcx.llbb; @@ -499,6 +501,7 @@ pub fn trans_foreign_mod(ccx: @CrateContext, llshimfn, llwrapfn, ccx.upcalls.call_shim_on_c_stack, + false, build_args, build_ret); @@ -1229,6 +1232,7 @@ pub fn trans_foreign_fn(ccx: @CrateContext, llshimfn, llwrapfn, ccx.upcalls.call_shim_on_rust_stack, + true, build_args, build_ret); diff --git a/src/test/bench/shootout-reverse-complement.rs b/src/test/bench/shootout-reverse-complement.rs index 21b1f8f3c82b..e3774be053cd 100644 --- a/src/test/bench/shootout-reverse-complement.rs +++ b/src/test/bench/shootout-reverse-complement.rs @@ -1,3 +1,5 @@ +// xfail-pretty + use core::cast::transmute; use core::libc::{STDOUT_FILENO, c_int, fdopen, fgets, fopen, fputc, fwrite}; use core::libc::{size_t};