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);