Skip to content

Commit c011f13

Browse files
committed
Add kind-checking for assign-op, copy, ret, be, fail exprs. Fix caught kinding-violations in rustc and libstd.
1 parent a3c8d4a commit c011f13

28 files changed

+45
-35
lines changed

src/comp/driver/rustc.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ fn parse_input_src(sess: session::session, cfg: &ast::crate_cfg, infile: str)
108108
ret {crate: crate, src: src};
109109
}
110110

111-
fn time<T>(do_it: bool, what: str, thunk: fn() -> T) -> T {
111+
fn time<@T>(do_it: bool, what: str, thunk: fn() -> T) -> T {
112112
if !do_it { ret thunk(); }
113113
let start = std::time::precise_time_s();
114114
let rv = thunk();

src/comp/front/attr.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,7 @@ fn require_unique_names(sess: &session::session, metas: &[@ast::meta_item]) {
189189
}
190190
}
191191

192-
fn span<T>(item: &T) -> ast::spanned<T> {
192+
fn span<@T>(item: &T) -> ast::spanned<T> {
193193
ret {node: item, span: ast_util::dummy_sp()};
194194
}
195195

src/comp/front/test.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ fn mk_test_module(cx: &test_ctxt) -> @ast::item {
170170
ret @item;
171171
}
172172

173-
fn nospan<T>(t: &T) -> ast::spanned<T> {
173+
fn nospan<@T>(t: &T) -> ast::spanned<T> {
174174
ret {node: t, span: dummy_sp()};
175175
}
176176

src/comp/middle/kind.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ import syntax::ast_util;
7676
import syntax::visit;
7777

7878
import std::vec;
79+
import std::option;
7980

8081
import ast::kind;
8182
import ast::kind_unique;
@@ -135,7 +136,20 @@ fn check_expr(tcx: &ty::ctxt, e: &@ast::expr) {
135136
alt e.node {
136137
ast::expr_move(a, b) { need_shared_lhs_rhs(tcx, a, b, "<-"); }
137138
ast::expr_assign(a, b) { need_shared_lhs_rhs(tcx, a, b, "="); }
139+
ast::expr_assign_op(_, a, b) { need_shared_lhs_rhs(tcx, a, b, "op="); }
138140
ast::expr_swap(a, b) { need_shared_lhs_rhs(tcx, a, b, "<->"); }
141+
ast::expr_copy(a) {
142+
need_expr_kind(tcx, a, ast::kind_shared, "'copy' operand");
143+
}
144+
ast::expr_ret(option::some(a)) {
145+
need_expr_kind(tcx, a, ast::kind_shared, "'ret' operand");
146+
}
147+
ast::expr_be(a) {
148+
need_expr_kind(tcx, a, ast::kind_shared, "'be' operand");
149+
}
150+
ast::expr_fail(option::some(a)) {
151+
need_expr_kind(tcx, a, ast::kind_shared, "'fail' operand");
152+
}
139153
ast::expr_call(callee, _) {
140154
let tpt = ty::expr_ty_params_and_ty(tcx, callee);
141155

src/comp/syntax/ast_util.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import std::option;
33
import codemap::span;
44
import ast::*;
55

6-
fn respan<T>(sp: &span, t: &T) -> spanned<T> { ret {node: t, span: sp}; }
6+
fn respan<@T>(sp: &span, t: &T) -> spanned<T> { ret {node: t, span: sp}; }
77

88
/* assuming that we're not in macro expansion */
99
fn mk_sp(lo: uint, hi: uint) -> span {

src/comp/syntax/parse/parser.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,7 @@ fn expect_gt(p: &parser) {
222222
}
223223
}
224224

225-
fn spanned<T>(lo: uint, hi: uint, node: &T) -> spanned<T> {
225+
fn spanned<@T>(lo: uint, hi: uint, node: &T) -> spanned<T> {
226226
ret {node: node, span: ast_util::mk_sp(lo, hi)};
227227
}
228228

src/comp/syntax/util/interner.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ fn intern<@T>(itr: &interner<T>, val: &T) -> uint {
3333
}
3434
}
3535

36-
fn get<T>(itr: &interner<T>, idx: uint) -> T { ret itr.vect[idx]; }
36+
fn get<@T>(itr: &interner<T>, idx: uint) -> T { ret itr.vect[idx]; }
3737

3838
fn len<T>(itr: &interner<T>) -> uint { ret vec::len(itr.vect); }
3939

src/lib/task.rs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,6 @@ type task_context = {regs: x86_registers, next: *u8};
3838

3939
resource rust_task_ptr(task: *rust_task) { rustrt::drop_task(task); }
4040

41-
fn get_task_ptr(id: task) -> rust_task_ptr {
42-
ret rust_task_ptr(rustrt::get_task_pointer(id));
43-
}
44-
4541
type task = int;
4642
type task_id = task;
4743

@@ -107,7 +103,7 @@ fn spawn_inner(thunk: -fn(), notify: option<comm::chan<task_notification>>) ->
107103
// stack.
108104

109105
// set up the task pointer
110-
let task_ptr = get_task_ptr(id);
106+
let task_ptr = rust_task_ptr(rustrt::get_task_pointer(id));
111107
let regs = ptr::addr_of((**task_ptr).ctx.regs);
112108
(*regs).edx = cast(*task_ptr);;
113109
(*regs).esp = cast((**task_ptr).stack_ptr);

src/lib/unsafe.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ native "rust" mod rustrt {
99
}
1010

1111
// Casts the value at `src` to U. The two types must have the same length.
12-
fn reinterpret_cast<T, U>(src: &T) -> U { ret rusti::cast(src); }
12+
fn reinterpret_cast<T, @U>(src: &T) -> U { ret rusti::cast(src); }
1313

1414
fn leak<@T>(thing: -T) {
1515
rustrt::leak(thing);

src/lib/util.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11

22

3-
fn id<T>(x: &T) -> T { ret x; }
3+
fn id<@T>(x: &T) -> T { ret x; }
44

55

66
/* FIXME (issue #141): See test/run-pass/constrained-type.rs. Uncomment

src/test/compile-fail/block-copy.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// error-pattern: non-copyable
1+
// error-pattern: mismatched kinds
22

33
fn lol(f: &block()) -> block() { ret f; }
44
fn main() { let i = 8; let f = lol(block () { log_err i; }); f(); }

src/test/compiletest/procsrv.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ fn worker(p: port<request>) {
150150
}
151151
}
152152

153-
fn with_lib_path<T>(path: &str, f: fn() -> T) -> T {
153+
fn with_lib_path<@T>(path: &str, f: fn() -> T) -> T {
154154
let maybe_oldpath = getenv(util::lib_path_env_var());
155155
append_lib_path(path);
156156
let res = f();

src/test/run-pass/auto-instantiate.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,6 @@
22

33

44
// -*- rust -*-
5-
fn f<T, U>(x: &T, y: &U) -> {a: T, b: U} { ret {a: x, b: y}; }
5+
fn f<@T, @U>(x: &T, y: &U) -> {a: T, b: U} { ret {a: x, b: y}; }
66

77
fn main() { log f({x: 3, y: 4, z: 5}, 4).a.x; log f(5, 6).a; }

src/test/run-pass/autobind.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
fn f<T>(x: &[T]) -> T { ret x[0]; }
1+
fn f<@T>(x: &[T]) -> T { ret x[0]; }
22

33
fn g(act: fn(&[int]) -> int) -> int { ret act([1, 2, 3]); }
44

src/test/run-pass/box-unbox.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
type box<T> = {c: @T};
44

5-
fn unbox<T>(b: &box<T>) -> T { ret *b.c; }
5+
fn unbox<@T>(b: &box<T>) -> T { ret *b.c; }
66

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

src/test/run-pass/fixed-point-bind-box.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
fn fix_help<A, B>(f: @fn(@fn(&A) -> B, &A) -> B, x: &A) -> B {
1+
fn fix_help<A, @B>(f: @fn(@fn(&A) -> B, &A) -> B, x: &A) -> B {
22
ret f(@bind fix_help(f, _), x);
33
}
44

5-
fn fix<A, B>(f: @fn(@fn(&A) -> B, &A) -> B) -> @fn(&A) -> B {
5+
fn fix<A, @B>(f: @fn(@fn(&A) -> B, &A) -> B) -> @fn(&A) -> B {
66
ret @bind fix_help(f, _);
77
}
88

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11

22

3-
fn id<T>(t: &T) -> T { ret t; }
3+
fn id<@T>(t: &T) -> T { ret t; }
44

55
fn main() {
66
let expected = @100;

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11

22

3-
fn id<T>(t: &T) -> T { ret t; }
3+
fn id<@T>(t: &T) -> T { ret t; }
44

55
fn main() {
66
let t = {a: 1, b: 2, c: 3, d: 4, e: 5, f: 6, g: 7};

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11

22

3-
fn id<T>(t: &T) -> T { ret t; }
3+
fn id<@T>(t: &T) -> T { ret t; }
44

55
fn main() {
66
let t = {_0: 1, _1: 2, _2: 3, _3: 4, _4: 5, _5: 6, _6: 7};

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11

22

3-
fn g<X>(x: &X) -> X { ret x; }
3+
fn g<@X>(x: &X) -> X { ret x; }
44

5-
fn f<T>(t: &T) -> {a: T, b: T} {
5+
fn f<@T>(t: &T) -> {a: T, b: T} {
66
type pair = {a: T, b: T};
77

88
let x: pair = {a: t, b: t};

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,6 @@
44
// -*- rust -*-
55

66
// Issue #45: infer type parameters in function applications
7-
fn id<T>(x: &T) -> T { ret x; }
7+
fn id<@T>(x: &T) -> T { ret x; }
88

99
fn main() { let x: int = 42; let y: int = id(x); assert (x == y); }

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33

44
// -*- rust -*-
5-
fn id<T>(x: &T) -> T { ret x; }
5+
fn id<@T>(x: &T) -> T { ret x; }
66

77
type triple = {x: int, y: int, z: int};
88

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11

22

3-
obj handle<T>(data: T) {
3+
obj handle<@T>(data: T) {
44
fn get() -> T { ret data; }
55
}
66

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11

22

3-
obj buf<T>(data: {_0: T, _1: T, _2: T}) {
3+
obj buf<@T>(data: {_0: T, _1: T, _2: T}) {
44
fn get(i: int) -> T {
55
if i == 0 {
66
ret data._0;

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
fn get_third<T>(t: &(T, T, T)) -> T { let (_, _, x) = t; ret x; }
1+
fn get_third<@T>(t: &(T, T, T)) -> T { let (_, _, x) = t; ret x; }
22

33
fn main() {
44
log get_third((1, 2, 3));

src/test/run-pass/issue-333.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
fn quux<T>(x: &T) -> T { let f = id::<T>; ret f(x); }
1+
fn quux<@T>(x: &T) -> T { let f = id::<T>; ret f(x); }
22

3-
fn id<T>(x: &T) -> T { ret x; }
3+
fn id<@T>(x: &T) -> T { ret x; }
44

55
fn main() { assert (quux(10) == 10); }

src/test/run-pass/newtype-polymorphic.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
tag myvec<X> = [X];
22

3-
fn myvec_deref<X>(mv: &myvec<X>) -> [X] { ret *mv; }
3+
fn myvec_deref<@X>(mv: &myvec<X>) -> [X] { ret *mv; }
44

5-
fn myvec_elt<X>(mv: &myvec<X>) -> X { ret mv[0]; }
5+
fn myvec_elt<@X>(mv: &myvec<X>) -> X { ret mv[0]; }
66

77
fn main() {
88
let mv = myvec([1, 2, 3]);

src/test/run-pass/ret-none.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,6 @@
22

33
tag option<T> { none; some(T); }
44

5-
fn f<T>() -> option<T> { ret none; }
5+
fn f<@T>() -> option<T> { ret none; }
66

77
fn main() { f::<int>(); }

0 commit comments

Comments
 (0)