Skip to content

Commit 67bcc70

Browse files
committed
rustboot: Emit an error instead of asserting in trans when a T is passed by value
1 parent b914e0e commit 67bcc70

11 files changed

+36
-17
lines changed

src/boot/me/type.ml

+20-1
Original file line numberDiff line numberDiff line change
@@ -1308,6 +1308,23 @@ let process_crate (cx:Semant.ctxt) (crate:Ast.crate) : unit =
13081308
Common.err (Some item_id) "this function must return a value"
13091309
in
13101310

1311+
let check_fn_ty_validity item_id (ty_sig, _) =
1312+
let check_input_slot i slot =
1313+
match slot with
1314+
{
1315+
Ast.slot_ty = Some (Ast.TY_param _);
1316+
Ast.slot_mode = Ast.MODE_local
1317+
} ->
1318+
Common.err
1319+
(Some item_id)
1320+
"parameter %d of this type-parametric function must be \
1321+
passed by reference, not by value"
1322+
(i + 1)
1323+
| _ -> ()
1324+
in
1325+
Array.iteri check_input_slot ty_sig.Ast.sig_input_slots
1326+
in
1327+
13111328
let visit_mod_item_pre _ _ item =
13121329
let { Common.node = item; Common.id = item_id } = item in
13131330
match item.Ast.decl_item with
@@ -1316,7 +1333,9 @@ let process_crate (cx:Semant.ctxt) (crate:Ast.crate) : unit =
13161333
let fn_ty = Hashtbl.find cx.Semant.ctxt_all_item_types item_id in
13171334
begin
13181335
match fn_ty with
1319-
Ast.TY_fn ty_fn -> push_fn_ctx_of_ty_fn ty_fn
1336+
Ast.TY_fn ty_fn ->
1337+
check_fn_ty_validity item_id ty_fn;
1338+
push_fn_ctx_of_ty_fn ty_fn
13201339
| _ ->
13211340
Common.bug ()
13221341
"Type.visit_mod_item_pre: fn item didn't have a fn type"

src/lib/list.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ tag list[T] {
1212
nil;
1313
}
1414

15-
fn foldl[T,U](&list[T] ls, U u, fn(&T t, U u) -> U f) -> U {
15+
fn foldl[T,U](&list[T] ls, &U u, fn(&T t, U u) -> U f) -> U {
1616
alt(ls) {
1717
case (cons[T](?hd, ?tl)) {
1818
auto u_ = f(hd, u);
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
fn f[T](@int i, T t) {}
1+
fn f[T](@int i, &T t) {}
22

33
fn main() {
44
auto x = bind f[char](@0xdeafbeef, _);
5-
}
5+
}

src/test/run-pass/generic-bind.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
fn id[T](T t) -> T {
1+
fn id[T](&T t) -> T {
22
ret t;
33
}
44

55
fn main() {
66
auto f = bind id[int](_);
77
check (f(10) == 10);
8-
}
8+
}

src/test/run-pass/generic-derived-type.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
fn g[X](X x) -> X {
1+
fn g[X](&X x) -> X {
22
ret x;
33
}
44

5-
fn f[T](T t) -> tup(T,T) {
5+
fn f[T](&T t) -> tup(T,T) {
66
type pair = tup(T,T);
77
let pair x = tup(t,t);
88
ret g[pair](x);
+2-2
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
fn f[T](T t) {
1+
fn f[T](&T t) {
22
log "dropping";
33
}
44

55
fn main() {
66
type r = rec(@int x, @int y);
77
auto x = rec(x=@10, y=@12);
88
f[r](x);
9-
}
9+
}

src/test/run-pass/generic-exterior-box.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
type tupbox[T] = tup(@T);
22
type recbox[T] = rec(@T x);
33

4-
fn tuplift[T](T t) -> tupbox[T] { ret tup(@t); }
5-
fn reclift[T](T t) -> recbox[T] { ret rec(x=@t); }
4+
fn tuplift[T](&T t) -> tupbox[T] { ret tup(@t); }
5+
fn reclift[T](&T t) -> recbox[T] { ret rec(x=@t); }
66

77
fn main() {
88
let int foo = 17;

src/test/run-pass/generic-fn.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// -*- rust -*-
22

3-
fn id[T](T x) -> T {
3+
fn id[T](&T x) -> T {
44
ret x;
55
}
66

src/test/run-pass/generic-iter-frame.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ iter i() -> () {
44
put ();
55
}
66

7-
fn foo[T](T t) {
7+
fn foo[T](&T t) {
88
let int x = 10;
99
for each (() j in i()) {
1010
log x;
+2-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
fn leaky[T](T t) {
1+
fn leaky[T](&T t) {
22
}
33

44
fn main() {
55
auto x = @10;
66
leaky[@int](x);
7-
}
7+
}

src/test/run-pass/lib-deque.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ fn test_boxes(@int a, @int b, @int c, @int d) {
9292

9393
type eqfn[T] = fn(T a, T b) -> bool;
9494

95-
fn test_parameterized[T](eqfn[T] e, T a, T b, T c, T d) {
95+
fn test_parameterized[T](eqfn[T] e, &T a, &T b, &T c, &T d) {
9696
let deque.t[T] deq = deque.create[T]();
9797
check (deq.size() == 0u);
9898
deq.add_front(a);

0 commit comments

Comments
 (0)