Skip to content

Commit f3c05b9

Browse files
committed
Turn on kind propagation for typarams. Annotate a bunch of typarams in rustc and libstd.
1 parent c34d743 commit f3c05b9

File tree

9 files changed

+89
-91
lines changed

9 files changed

+89
-91
lines changed

src/comp/metadata/tydecode.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ fn parse_ty_constr_arg(st: @pstate, sd: str_def) ->
150150
}
151151
}
152152

153-
fn parse_constr[T](st: @pstate, sd: str_def, pser: arg_parser[T]) ->
153+
fn parse_constr[@T](st: @pstate, sd: str_def, pser: arg_parser[T]) ->
154154
@ty::constr_general[T] {
155155
let sp = {lo: 0u, hi: 0u}; // FIXME: use a real span
156156
let args: (@sp_constr_arg[T])[] = ~[];

src/comp/middle/ty.rs

+1-4
Original file line numberDiff line numberDiff line change
@@ -1129,10 +1129,7 @@ fn type_kind(cx: &ctxt, ty: &t) -> ast::kind {
11291129
ty_var(_) { fail; }
11301130

11311131
ty_param(_,k) {
1132-
// FIXME: when you turn this on, the stdlib will break; be sure
1133-
// to have a snapshot done that understands kinds before doing so.
1134-
1135-
// result = kind::lower_kind(result, k);
1132+
result = kind::lower_kind(result, k);
11361133
}
11371134

11381135
ty_constr(t, _) {

src/lib/deque.rs

+7-7
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ type t[T] =
1616
fn get(int) -> T ;
1717
};
1818

19-
fn create[T]() -> t[T] {
19+
fn create[@T]() -> t[T] {
2020
type cell[T] = option::t[T];
2121

2222
let initial_capacity: uint = 32u; // 2^5
@@ -26,7 +26,7 @@ fn create[T]() -> t[T] {
2626
*/
2727

2828

29-
fn grow[T](nelts: uint, lo: uint, elts: &(cell[T])[mutable ]) ->
29+
fn grow[@T](nelts: uint, lo: uint, elts: &(cell[T])[mutable ]) ->
3030
(cell[T])[mutable ] {
3131
assert (nelts == ivec::len(elts));
3232
let rv = ~[mutable ];
@@ -42,13 +42,13 @@ fn create[T]() -> t[T] {
4242

4343
ret rv;
4444
}
45-
fn get[T](elts: &(cell[T])[mutable ], i: uint) -> T {
45+
fn get[@T](elts: &(cell[T])[mutable ], i: uint) -> T {
4646
ret alt elts.(i) { option::some(t) { t } _ { fail } };
4747
}
48-
obj deque[T](mutable nelts: uint,
49-
mutable lo: uint,
50-
mutable hi: uint,
51-
mutable elts: (cell[T])[mutable ]) {
48+
obj deque[@T](mutable nelts: uint,
49+
mutable lo: uint,
50+
mutable hi: uint,
51+
mutable elts: (cell[T])[mutable ]) {
5252
fn size() -> uint { ret nelts; }
5353
fn add_front(t: &T) {
5454
let oldlo: uint = lo;

src/lib/ivec.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ fn grow_fn[T](v: &mutable T[], n: uint, init_fn: fn(uint) -> T ) {
168168
/// Sets the element at position `index` to `val`. If `index` is past the end
169169
/// of the vector, expands the vector by replicating `initval` to fill the
170170
/// intervening space.
171-
fn grow_set[T](v: &mutable T[mutable ], index: uint, initval: &T, val: &T) {
171+
fn grow_set[@T](v: &mutable T[mutable ], index: uint, initval: &T, val: &T) {
172172
if index >= len(v) { grow_mut(v, index - len(v) + 1u, initval); }
173173
v.(index) = val;
174174
}

src/lib/list.rs

+7-7
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import option::none;
88
// our recursion rules do not permit that.
99
tag list[T] { cons(T, @list[T]); nil; }
1010

11-
fn from_vec[T](v: vec[T]) -> list[T] {
11+
fn from_vec[@T](v: vec[T]) -> list[T] {
1212
let l = nil[T];
1313
// FIXME: This would be faster and more space efficient if it looped over
1414
// a reverse vector iterator. Unfortunately generic iterators seem not to
@@ -18,7 +18,7 @@ fn from_vec[T](v: vec[T]) -> list[T] {
1818
ret l;
1919
}
2020

21-
fn foldl[T, U](ls_: &list[T], u: &U, f: fn(&T, &U) -> U ) -> U {
21+
fn foldl[@T, @U](ls_: &list[T], u: &U, f: fn(&T, &U) -> U ) -> U {
2222
let accum: U = u;
2323
let ls = ls_;
2424
while true {
@@ -30,7 +30,7 @@ fn foldl[T, U](ls_: &list[T], u: &U, f: fn(&T, &U) -> U ) -> U {
3030
ret accum;
3131
}
3232

33-
fn find[T, U](ls_: &list[T], f: fn(&T) -> option::t[U] ) -> option::t[U] {
33+
fn find[@T, @U](ls_: &list[T], f: fn(&T) -> option::t[U] ) -> option::t[U] {
3434
let ls = ls_;
3535
while true {
3636
alt ls {
@@ -43,7 +43,7 @@ fn find[T, U](ls_: &list[T], f: fn(&T) -> option::t[U] ) -> option::t[U] {
4343
ret none;
4444
}
4545

46-
fn has[T](ls_: &list[T], elt: &T) -> bool {
46+
fn has[@T](ls_: &list[T], elt: &T) -> bool {
4747
let ls = ls_;
4848
while true {
4949
alt ls {
@@ -60,11 +60,11 @@ fn length[T](ls: &list[T]) -> uint {
6060
ret foldl[T, uint](ls, 0u, bind count[T](_, _));
6161
}
6262

63-
fn cdr[T](ls: &list[T]) -> list[T] { alt ls { cons(_, tl) { ret *tl; } } }
63+
fn cdr[@T](ls: &list[T]) -> list[T] { alt ls { cons(_, tl) { ret *tl; } } }
6464

65-
fn car[T](ls: &list[T]) -> T { alt ls { cons(hd, _) { ret hd; } } }
65+
fn car[@T](ls: &list[T]) -> T { alt ls { cons(hd, _) { ret hd; } } }
6666

67-
fn append[T](l: &list[T], m: &list[T]) -> list[T] {
67+
fn append[@T](l: &list[T], m: &list[T]) -> list[T] {
6868
alt l {
6969
nil. { ret m; }
7070
cons(x, xs) {

src/lib/map.rs

+23-23
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,9 @@ type hashmap[K, V] =
1919
};
2020
type hashset[K] = hashmap[K, ()];
2121

22-
fn set_add[K](set: hashset[K], key: &K) -> bool { ret set.insert(key, ()); }
22+
fn set_add[@K](set: hashset[K], key: &K) -> bool { ret set.insert(key, ()); }
2323

24-
fn mk_hashmap[K, V](hasher: &hashfn[K], eqer: &eqfn[K]) -> hashmap[K, V] {
24+
fn mk_hashmap[@K, @V](hasher: &hashfn[K], eqer: &eqfn[K]) -> hashmap[K, V] {
2525
let initial_capacity: uint = 32u; // 2^5
2626

2727
let load_factor: util::rational = {num: 3, den: 4};
@@ -53,10 +53,10 @@ fn mk_hashmap[K, V](hasher: &hashfn[K], eqer: &eqfn[K]) -> hashmap[K, V] {
5353
* will fail.
5454
*/
5555

56-
fn insert_common[K,
57-
V](hasher: &hashfn[K], eqer: &eqfn[K],
58-
bkts: &(bucket[K, V])[mutable ], nbkts: uint, key: &K,
59-
val: &V) -> bool {
56+
fn insert_common[@K,
57+
@V](hasher: &hashfn[K], eqer: &eqfn[K],
58+
bkts: &(bucket[K, V])[mutable ], nbkts: uint,
59+
key: &K, val: &V) -> bool {
6060
let i: uint = 0u;
6161
let h: uint = hasher(key);
6262
while i < nbkts {
@@ -78,9 +78,9 @@ fn mk_hashmap[K, V](hasher: &hashfn[K], eqer: &eqfn[K]) -> hashmap[K, V] {
7878
fail; // full table
7979

8080
}
81-
fn find_common[K,
82-
V](hasher: &hashfn[K], eqer: &eqfn[K],
83-
bkts: &(bucket[K, V])[mutable ], nbkts: uint, key: &K)
81+
fn find_common[@K,
82+
@V](hasher: &hashfn[K], eqer: &eqfn[K],
83+
bkts: &(bucket[K, V])[mutable ], nbkts: uint, key: &K)
8484
-> option::t[V] {
8585
let i: uint = 0u;
8686
let h: uint = hasher(key);
@@ -101,10 +101,10 @@ fn mk_hashmap[K, V](hasher: &hashfn[K], eqer: &eqfn[K]) -> hashmap[K, V] {
101101
}
102102
ret option::none[V];
103103
}
104-
fn rehash[K,
105-
V](hasher: &hashfn[K], eqer: &eqfn[K],
106-
oldbkts: &(bucket[K, V])[mutable ], noldbkts: uint,
107-
newbkts: &(bucket[K, V])[mutable ], nnewbkts: uint) {
104+
fn rehash[@K,
105+
@V](hasher: &hashfn[K], eqer: &eqfn[K],
106+
oldbkts: &(bucket[K, V])[mutable ], noldbkts: uint,
107+
newbkts: &(bucket[K, V])[mutable ], nnewbkts: uint) {
108108
for b: bucket[K, V] in oldbkts {
109109
alt b {
110110
some(k_, v_) {
@@ -116,13 +116,13 @@ fn mk_hashmap[K, V](hasher: &hashfn[K], eqer: &eqfn[K]) -> hashmap[K, V] {
116116
}
117117
}
118118
}
119-
obj hashmap[K,
120-
V](hasher: hashfn[K],
121-
eqer: eqfn[K],
122-
mutable bkts: (bucket[K, V])[mutable ],
123-
mutable nbkts: uint,
124-
mutable nelts: uint,
125-
lf: util::rational) {
119+
obj hashmap[@K,
120+
@V](hasher: hashfn[K],
121+
eqer: eqfn[K],
122+
mutable bkts: (bucket[K, V])[mutable ],
123+
mutable nbkts: uint,
124+
mutable nelts: uint,
125+
lf: util::rational) {
126126
fn size() -> uint { ret nelts; }
127127
fn insert(key: &K, val: &V) -> bool {
128128
let load: util::rational =
@@ -199,17 +199,17 @@ fn mk_hashmap[K, V](hasher: &hashfn[K], eqer: &eqfn[K]) -> hashmap[K, V] {
199199

200200
// Hash map constructors for basic types
201201

202-
fn new_str_hash[V]() -> hashmap[str, V] {
202+
fn new_str_hash[@V]() -> hashmap[str, V] {
203203
ret mk_hashmap(str::hash, str::eq);
204204
}
205205

206-
fn new_int_hash[V]() -> hashmap[int, V] {
206+
fn new_int_hash[@V]() -> hashmap[int, V] {
207207
fn hash_int(x: &int) -> uint { ret x as uint; }
208208
fn eq_int(a: &int, b: &int) -> bool { ret a == b; }
209209
ret mk_hashmap[int, V](hash_int, eq_int);
210210
}
211211

212-
fn new_uint_hash[V]() -> hashmap[uint, V] {
212+
fn new_uint_hash[@V]() -> hashmap[uint, V] {
213213
fn hash_uint(x: &uint) -> uint { ret x; }
214214
fn eq_uint(a: &uint, b: &uint) -> bool { ret a == b; }
215215
ret mk_hashmap[uint, V](hash_uint, eq_uint);

src/lib/sort.rs

+15-15
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ export quick_sort3;
1111

1212
type lteq[T] = fn(&T, &T) -> bool ;
1313

14-
fn merge_sort[T](le: lteq[T], v: vec[T]) -> vec[T] {
14+
fn merge_sort[@T](le: lteq[T], v: vec[T]) -> vec[T] {
1515
fn merge[T](le: lteq[T], a: vec[T], b: vec[T]) -> vec[T] {
1616
let rs: vec[T] = [];
1717
let a_len: uint = len[T](a);
@@ -36,13 +36,13 @@ fn merge_sort[T](le: lteq[T], v: vec[T]) -> vec[T] {
3636
ret merge[T](le, merge_sort[T](le, a), merge_sort[T](le, b));
3737
}
3838

39-
fn swap[T](arr: vec[mutable T], x: uint, y: uint) {
39+
fn swap[@T](arr: vec[mutable T], x: uint, y: uint) {
4040
let a = arr.(x);
4141
arr.(x) = arr.(y);
4242
arr.(y) = a;
4343
}
4444

45-
fn part[T](compare_func: lteq[T], arr: vec[mutable T], left: uint,
45+
fn part[@T](compare_func: lteq[T], arr: vec[mutable T], left: uint,
4646
right: uint, pivot: uint) -> uint {
4747
let pivot_value = arr.(pivot);
4848
swap[T](arr, pivot, right);
@@ -59,7 +59,7 @@ fn part[T](compare_func: lteq[T], arr: vec[mutable T], left: uint,
5959
ret storage_index;
6060
}
6161

62-
fn qsort[T](compare_func: lteq[T], arr: vec[mutable T], left: uint,
62+
fn qsort[@T](compare_func: lteq[T], arr: vec[mutable T], left: uint,
6363
right: uint) {
6464
if right > left {
6565
let pivot = (left + right) / 2u;
@@ -72,7 +72,7 @@ fn qsort[T](compare_func: lteq[T], arr: vec[mutable T], left: uint,
7272
}
7373
}
7474

75-
fn quick_sort[T](compare_func: lteq[T], arr: vec[mutable T]) {
75+
fn quick_sort[@T](compare_func: lteq[T], arr: vec[mutable T]) {
7676
if len[T](arr) == 0u { ret; }
7777
qsort[T](compare_func, arr, 0u, len[T](arr) - 1u);
7878
}
@@ -82,7 +82,7 @@ fn quick_sort[T](compare_func: lteq[T], arr: vec[mutable T]) {
8282
// http://www.cs.princeton.edu/~rs/talks/QuicksortIsOptimal.pdf
8383
// According to these slides this is the algorithm of choice for
8484
// 'randomly ordered keys, abstract compare' & 'small number of key values'
85-
fn qsort3[T](compare_func_lt: lteq[T], compare_func_eq: lteq[T],
85+
fn qsort3[@T](compare_func_lt: lteq[T], compare_func_eq: lteq[T],
8686
arr: vec[mutable T], left: int, right: int) {
8787
if right <= left { ret; }
8888
let v: T = arr.(right);
@@ -130,7 +130,7 @@ fn qsort3[T](compare_func_lt: lteq[T], compare_func_eq: lteq[T],
130130
qsort3[T](compare_func_lt, compare_func_eq, arr, i, right);
131131
}
132132

133-
fn quick_sort3[T](compare_func_lt: lteq[T], compare_func_eq: lteq[T],
133+
fn quick_sort3[@T](compare_func_lt: lteq[T], compare_func_eq: lteq[T],
134134
arr: vec[mutable T]) {
135135
if vec::len[T](arr) == 0u { ret; }
136136
qsort3[T](compare_func_lt, compare_func_eq, arr, 0,
@@ -144,8 +144,8 @@ mod ivector {
144144

145145
type lteq[T] = fn(&T, &T) -> bool ;
146146

147-
fn merge_sort[T](le: lteq[T], v: &T[]) -> T[] {
148-
fn merge[T](le: lteq[T], a: &T[], b: &T[]) -> T[] {
147+
fn merge_sort[@T](le: lteq[T], v: &T[]) -> T[] {
148+
fn merge[@T](le: lteq[T], a: &T[], b: &T[]) -> T[] {
149149
let rs: T[] = ~[];
150150
let a_len: uint = ilen[T](a);
151151
let a_ix: uint = 0u;
@@ -169,13 +169,13 @@ mod ivector {
169169
ret merge[T](le, merge_sort[T](le, a), merge_sort[T](le, b));
170170
}
171171

172-
fn swap[T](arr: &T[mutable ], x: uint, y: uint) {
172+
fn swap[@T](arr: &T[mutable ], x: uint, y: uint) {
173173
let a = arr.(x);
174174
arr.(x) = arr.(y);
175175
arr.(y) = a;
176176
}
177177

178-
fn part[T](compare_func: lteq[T], arr: &T[mutable ], left: uint,
178+
fn part[@T](compare_func: lteq[T], arr: &T[mutable ], left: uint,
179179
right: uint, pivot: uint) -> uint {
180180
let pivot_value = arr.(pivot);
181181
swap[T](arr, pivot, right);
@@ -192,7 +192,7 @@ mod ivector {
192192
ret storage_index;
193193
}
194194

195-
fn qsort[T](compare_func: lteq[T], arr: &T[mutable ], left: uint,
195+
fn qsort[@T](compare_func: lteq[T], arr: &T[mutable ], left: uint,
196196
right: uint) {
197197
if right > left {
198198
let pivot = (left + right) / 2u;
@@ -205,7 +205,7 @@ mod ivector {
205205
}
206206
}
207207

208-
fn quick_sort[T](compare_func: lteq[T], arr: &T[mutable ]) {
208+
fn quick_sort[@T](compare_func: lteq[T], arr: &T[mutable ]) {
209209
if ilen[T](arr) == 0u { ret; }
210210
qsort[T](compare_func, arr, 0u, ilen[T](arr) - 1u);
211211
}
@@ -216,7 +216,7 @@ mod ivector {
216216
// According to these slides this is the algorithm of choice for
217217
// 'randomly ordered keys, abstract compare' & 'small number of key
218218
// values'
219-
fn qsort3[T](compare_func_lt: lteq[T], compare_func_eq: lteq[T],
219+
fn qsort3[@T](compare_func_lt: lteq[T], compare_func_eq: lteq[T],
220220
arr: &T[mutable ], left: int, right: int) {
221221
if right <= left { ret; }
222222
let v: T = arr.(right);
@@ -264,7 +264,7 @@ mod ivector {
264264
qsort3[T](compare_func_lt, compare_func_eq, arr, i, right);
265265
}
266266

267-
fn quick_sort3[T](compare_func_lt: lteq[T], compare_func_eq: lteq[T],
267+
fn quick_sort3[@T](compare_func_lt: lteq[T], compare_func_eq: lteq[T],
268268
arr: &T[mutable ]) {
269269
if ilen[T](arr) == 0u { ret; }
270270
qsort3[T](compare_func_lt, compare_func_eq, arr, 0,

0 commit comments

Comments
 (0)