From ee901858a27bf00c7dd66e7cfecb9dd97029dba8 Mon Sep 17 00:00:00 2001 From: Patrick Walton Date: Thu, 28 Oct 2010 15:02:00 -0700 Subject: [PATCH] rustboot: Emit an error instead of asserting in trans when a T is passed by value --- src/boot/me/type.ml | 21 ++++++++++++++++++++- src/lib/list.rs | 2 +- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/boot/me/type.ml b/src/boot/me/type.ml index 2ff5e1286d7..21aecaf1455 100644 --- a/src/boot/me/type.ml +++ b/src/boot/me/type.ml @@ -1308,6 +1308,23 @@ let process_crate (cx:Semant.ctxt) (crate:Ast.crate) : unit = Common.err (Some item_id) "this function must return a value" in + let check_fn_ty_validity item_id (ty_sig, _) = + let check_input_slot i slot = + match slot with + { + Ast.slot_ty = Some (Ast.TY_param _); + Ast.slot_mode = Ast.MODE_local + } -> + Common.err + (Some item_id) + "parameter %d of this type-parametric function must be \ + passed by reference, not by value" + (i + 1) + | _ -> () + in + Array.iteri check_input_slot ty_sig.Ast.sig_input_slots + in + let visit_mod_item_pre _ _ item = let { Common.node = item; Common.id = item_id } = item in match item.Ast.decl_item with @@ -1316,7 +1333,9 @@ let process_crate (cx:Semant.ctxt) (crate:Ast.crate) : unit = let fn_ty = Hashtbl.find cx.Semant.ctxt_all_item_types item_id in begin match fn_ty with - Ast.TY_fn ty_fn -> push_fn_ctx_of_ty_fn ty_fn + Ast.TY_fn ty_fn -> + check_fn_ty_validity item_id ty_fn; + push_fn_ctx_of_ty_fn ty_fn | _ -> Common.bug () "Type.visit_mod_item_pre: fn item didn't have a fn type" diff --git a/src/lib/list.rs b/src/lib/list.rs index 7b8613151e7..da8d3c0aff7 100644 --- a/src/lib/list.rs +++ b/src/lib/list.rs @@ -12,7 +12,7 @@ tag list[T] { nil; } -fn foldl[T,U](&list[T] ls, U u, fn(&T t, U u) -> U f) -> U { +fn foldl[T,U](&list[T] ls, &U u, fn(&T t, U u) -> U f) -> U { alt(ls) { case (cons[T](?hd, ?tl)) { auto u_ = f(hd, u);