diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs index 657f184e8696c..483d6f7a5b005 100644 --- a/src/comp/middle/trans.rs +++ b/src/comp/middle/trans.rs @@ -7055,21 +7055,6 @@ fn arg_tys_of_fn(&@crate_ctxt ccx, ast::ann ann) -> vec[ty::arg] { } } -fn ret_ty_of_fn_ty(&@crate_ctxt ccx, ty::t t) -> ty::t { - alt (ty::struct(ccx.tcx, t)) { - case (ty::ty_fn(_, _, ?ret_ty, _, _)) { ret ret_ty; } - case (ty::ty_native_fn(_, _, ?ret_ty)) { ret ret_ty; } - case (_) { - ccx.sess.bug("ret_ty_of_fn_ty() called on non-function type: " + - ty_to_str(ccx.tcx, t)); - } - } -} - -fn ret_ty_of_fn(&@crate_ctxt ccx, ast::ann ann) -> ty::t { - ret ret_ty_of_fn_ty(ccx, ty::ann_to_type(ccx.tcx, ann)); -} - fn populate_fn_ctxt_from_llself(@fn_ctxt fcx, val_self_pair llself) { auto bcx = llstaticallocas_block_ctxt(fcx); let vec[ty::t] field_tys = []; @@ -7143,8 +7128,8 @@ fn trans_fn(@local_ctxt cx, &span sp, &ast::_fn f, ValueRef llfndecl, auto fcx = new_fn_ctxt(cx, sp, llfndecl); create_llargs_for_fn_args(fcx, f.proto, ty_self, - ret_ty_of_fn(cx.ccx, ann), f.decl.inputs, - ty_params); + ty::ret_ty_of_fn(cx.ccx.tcx, ann), + f.decl.inputs, ty_params); copy_any_self_to_alloca(fcx, ty_self); alt ({ fcx.llself }) { case (some(?llself)) { populate_fn_ctxt_from_llself(fcx, llself); } @@ -7275,7 +7260,8 @@ fn trans_obj(@local_ctxt cx, &span sp, &ast::_obj ob, ast::def_id oid, // Both regular arguments and type parameters are handled here. create_llargs_for_fn_args(fcx, ast::proto_fn, none[ty_self_pair], - ret_ty_of_fn(ccx, ann), fn_args, ty_params); + ty::ret_ty_of_fn(ccx.tcx, ann), + fn_args, ty_params); let vec[ty::arg] arg_tys = arg_tys_of_fn(ccx, ann); copy_args_to_allocas(fcx, fn_args, arg_tys); // Create the first block context in the function and keep a handle on it @@ -7286,7 +7272,7 @@ fn trans_obj(@local_ctxt cx, &span sp, &ast::_obj ob, ast::def_id oid, // Pick up the type of this object by looking at our own output type, that // is, the output type of the object constructor we're building. - auto self_ty = ret_ty_of_fn(ccx, ann); + auto self_ty = ty::ret_ty_of_fn(ccx.tcx, ann); auto llself_ty = type_of(ccx, sp, self_ty); // Set up the two-word pair that we're going to return from the object // constructor we're building. The two elements of this pair will be a @@ -7461,7 +7447,8 @@ fn trans_tag_variant(@local_ctxt cx, ast::def_id tag_id, let ValueRef llfndecl = cx.ccx.item_ids.get(variant.node.id); auto fcx = new_fn_ctxt(cx, variant.span, llfndecl); create_llargs_for_fn_args(fcx, ast::proto_fn, none[ty_self_pair], - ret_ty_of_fn(cx.ccx, variant.node.ann), fn_args, + ty::ret_ty_of_fn(cx.ccx.tcx, variant.node.ann), + fn_args, ty_params); let vec[ty::t] ty_param_substs = []; i = 0u; diff --git a/src/comp/middle/ty.rs b/src/comp/middle/ty.rs index 70071931732bd..df33890ea7f8d 100644 --- a/src/comp/middle/ty.rs +++ b/src/comp/middle/ty.rs @@ -21,6 +21,8 @@ import front::creader; import middle::metadata; import util::common::*; import util::data::interner; +import pretty::ppaux::ty_to_str; + export ann_to_monotype; export ann_to_type; @@ -2741,8 +2743,10 @@ fn lookup_item_type(ctxt cx, ast::def_id did) -> ty_param_count_and_ty { fn ret_ty_of_fn_ty(ctxt cx, t a_ty) -> t { alt (ty::struct(cx, a_ty)) { case (ty::ty_fn(_, _, ?ret_ty, _, _)) { ret ret_ty; } + case (ty::ty_native_fn(_, _, ?ret_ty)) { ret ret_ty; } case (_) { - cx.sess.bug("ret_ty_of_fn_ty() called on non-function type"); + cx.sess.bug("ret_ty_of_fn_ty() called on non-function type: " + + ty_to_str(cx, a_ty)); } } } diff --git a/src/test/run-pass/issue-506.rs b/src/test/run-pass/issue-506.rs index 623aae4beab6f..14611627542bb 100644 --- a/src/test/run-pass/issue-506.rs +++ b/src/test/run-pass/issue-506.rs @@ -2,6 +2,8 @@ A reduced test case for Issue #506, provided by Rob Arnold. */ +// xfail-stage0 + native "rust" mod rustrt { fn task_yield(); }