Skip to content

Commit c88933d

Browse files
committed
rustc: Implement unary move. Closes #917.
1 parent c4bb8f8 commit c88933d

File tree

15 files changed

+48
-24
lines changed

15 files changed

+48
-24
lines changed

src/etc/vim/syntax/rust.vim

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ syn match rustAssert "assert\(\w\)*"
1515
syn keyword rustKeyword alt again as break
1616
syn keyword rustKeyword check claim const copy do drop else export extern fail
1717
syn keyword rustKeyword for if impl import in let log
18-
syn keyword rustKeyword loop mod mut new of owned pure
18+
syn keyword rustKeyword loop mod move mut new of owned pure
1919
syn keyword rustKeyword ret self to unchecked
2020
syn match rustKeyword "unsafe" " Allows also matching unsafe::foo()
2121
syn keyword rustKeyword use while with

src/libcore/future.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ fn from_value<A>(+val: A) -> future<A> {
6060
})
6161
}
6262

63-
macro_rules! move{
63+
macro_rules! move_it {
6464
{$x:expr} => { unsafe { let y <- *ptr::addr_of($x); y } }
6565
}
6666

@@ -78,7 +78,7 @@ fn from_port<A:send>(-port: future_pipe::client::waiting<A>) -> future<A> {
7878
port_ <-> *port;
7979
let port = option::unwrap(port_);
8080
alt recv(port) {
81-
future_pipe::completed(data) { move!{data} }
81+
future_pipe::completed(data) { move_it!{data} }
8282
}
8383
}
8484
}

src/libcore/pipes.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,13 @@ export stream, port, chan, shared_chan, port_set, channel;
2222

2323
const SPIN_COUNT: uint = 0;
2424

25-
macro_rules! move {
25+
macro_rules! move_it {
2626
{ $x:expr } => { unsafe { let y <- *ptr::addr_of($x); y } }
2727
}
2828

2929
// This is to help make sure we only move out of enums in safe
3030
// places. Once there is unary move, it can be removed.
31-
fn move<T>(-x: T) -> T { x }
31+
fn move_it<T>(-x: T) -> T { x }
3232

3333
enum state {
3434
empty,
@@ -228,7 +228,7 @@ class buffer_resource<T: send> {
228228
}
229229

230230
drop unsafe {
231-
let b = move!{self.buffer};
231+
let b = move_it!{self.buffer};
232232
//let p = ptr::addr_of(*b);
233233
//error!{"drop %?", p};
234234
let old_count = atomic_sub_rel(b.header.ref_count, 1);
@@ -725,10 +725,10 @@ impl port<T: send> of recv<T> for port<T> {
725725
fn try_recv() -> option<T> {
726726
let mut endp = none;
727727
endp <-> self.endp;
728-
alt move(pipes::try_recv(unwrap(endp))) {
728+
alt move_it(pipes::try_recv(unwrap(endp))) {
729729
some(streamp::data(x, endp)) {
730-
self.endp = some(move!{endp});
731-
some(move!{x})
730+
self.endp = some(move_it!{endp});
731+
some(move_it!{x})
732732
}
733733
none { none }
734734
}
@@ -770,9 +770,9 @@ class port_set<T: send> : recv<T> {
770770
let i = wait_many(self.ports.map(|p| p.header()));
771771
// dereferencing an unsafe pointer nonsense to appease the
772772
// borrowchecker.
773-
alt move(unsafe {(*ptr::addr_of(self.ports[i])).try_recv()}) {
773+
alt move_it(unsafe {(*ptr::addr_of(self.ports[i])).try_recv()}) {
774774
some(m) {
775-
result = some(move!{m});
775+
result = some(move_it!{m});
776776
}
777777
none {
778778
// Remove this port.

src/libsyntax/ast.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -322,6 +322,7 @@ enum expr_ {
322322

323323
expr_copy(@expr),
324324
expr_move(@expr, @expr),
325+
expr_unary_move(@expr),
325326
expr_assign(@expr, @expr),
326327
expr_swap(@expr, @expr),
327328
expr_assign_op(binop, @expr, @expr),

src/libsyntax/fold.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -454,6 +454,7 @@ fn noop_fold_expr(e: expr_, fld: ast_fold) -> expr_ {
454454
expr_move(fld.fold_expr(el), fld.fold_expr(er))
455455
}
456456
expr_copy(e) { expr_copy(fld.fold_expr(e)) }
457+
expr_unary_move(e) { expr_unary_move(fld.fold_expr(e)) }
457458
expr_assign(el, er) {
458459
expr_assign(fld.fold_expr(el), fld.fold_expr(er))
459460
}

src/libsyntax/parse/parser.rs

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,12 @@ import ast::{_mod, add, alt_check, alt_exhaustive, arg, arm, attribute,
3131
expr_index, expr_lit, expr_log, expr_loop,
3232
expr_loop_body, expr_mac, expr_move, expr_new, expr_path,
3333
expr_rec, expr_ret, expr_swap, expr_struct, expr_tup, expr_unary,
34-
expr_vec, expr_vstore, expr_while, extern_fn, field, fn_decl,
35-
foreign_item, foreign_item_fn, foreign_mod, ident, impure_fn,
36-
infer, init_assign, init_move, initializer, instance_var, item,
37-
item_, item_class, item_const, item_enum, item_fn,
38-
item_foreign_mod, item_impl, item_mac, item_mod, item_trait,
39-
item_ty, lit, lit_, lit_bool, lit_float, lit_int,
34+
expr_unary_move, expr_vec, expr_vstore, expr_while, extern_fn,
35+
field, fn_decl, foreign_item, foreign_item_fn, foreign_mod,
36+
ident, impure_fn, infer, init_assign, init_move, initializer,
37+
instance_var, item, item_, item_class, item_const, item_enum,
38+
item_fn, item_foreign_mod, item_impl, item_mac, item_mod,
39+
item_trait, item_ty, lit, lit_, lit_bool, lit_float, lit_int,
4040
lit_int_unsuffixed, lit_nil, lit_str, lit_uint, local, m_const,
4141
m_imm, m_mutbl, mac_, mac_aq, mac_ellipsis,
4242
mac_invoc, mac_invoc_tt, mac_var, matcher, match_nonterminal,
@@ -854,6 +854,10 @@ class parser {
854854
let e = self.parse_expr();
855855
ex = expr_copy(e);
856856
hi = e.span.hi;
857+
} else if self.eat_keyword(~"move") {
858+
let e = self.parse_expr();
859+
ex = expr_unary_move(e);
860+
hi = e.span.hi;
857861
} else if self.token == token::MOD_SEP ||
858862
is_ident(self.token) && !self.is_keyword(~"true") &&
859863
!self.is_keyword(~"false") {

src/libsyntax/parse/token.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -327,7 +327,7 @@ fn restricted_keyword_table() -> hashmap<~str, ()> {
327327
~"fail", ~"false", ~"fn", ~"for",
328328
~"if", ~"iface", ~"impl", ~"import",
329329
~"let", ~"log", ~"loop",
330-
~"match", ~"mod", ~"module", ~"mut",
330+
~"match", ~"mod", ~"module", ~"move", ~"mut",
331331
~"new",
332332
~"owned",
333333
~"pure",

src/libsyntax/print/pprust.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1100,6 +1100,7 @@ fn print_expr(s: ps, &&expr: @ast::expr) {
11001100
print_block(s, blk);
11011101
}
11021102
ast::expr_copy(e) { word_space(s, ~"copy"); print_expr(s, e); }
1103+
ast::expr_unary_move(e) { word_space(s, ~"move"); print_expr(s, e); }
11031104
ast::expr_move(lhs, rhs) {
11041105
print_expr(s, lhs);
11051106
space(s.s);

src/libsyntax/visit.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -408,6 +408,7 @@ fn visit_expr<E>(ex: @expr, e: E, v: vt<E>) {
408408
expr_block(b) { v.visit_block(b, e, v); }
409409
expr_assign(a, b) { v.visit_expr(b, e, v); v.visit_expr(a, e, v); }
410410
expr_copy(a) { v.visit_expr(a, e, v); }
411+
expr_unary_move(a) { v.visit_expr(a, e, v); }
411412
expr_move(a, b) { v.visit_expr(b, e, v); v.visit_expr(a, e, v); }
412413
expr_swap(a, b) { v.visit_expr(a, e, v); v.visit_expr(b, e, v); }
413414
expr_assign_op(_, a, b) {

src/rustc/middle/borrowck/categorization.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,8 @@ impl public_methods for borrowck_ctxt {
181181
ast::expr_new(*) | ast::expr_binary(*) | ast::expr_while(*) |
182182
ast::expr_block(*) | ast::expr_loop(*) | ast::expr_alt(*) |
183183
ast::expr_lit(*) | ast::expr_break | ast::expr_mac(*) |
184-
ast::expr_again | ast::expr_rec(*) | ast::expr_struct(*) {
184+
ast::expr_again | ast::expr_rec(*) | ast::expr_struct(*) |
185+
ast::expr_unary_move(*) {
185186
ret self.cat_rvalue(expr, expr_ty);
186187
}
187188
}

src/rustc/middle/liveness.rs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -470,8 +470,8 @@ fn visit_expr(expr: @expr, &&self: @ir_maps, vt: vt<@ir_maps>) {
470470
expr_loop_body(*) | expr_do_body(*) | expr_cast(*) |
471471
expr_unary(*) | expr_fail(*) |
472472
expr_break | expr_again | expr_lit(_) | expr_ret(*) |
473-
expr_block(*) | expr_move(*) | expr_assign(*) | expr_swap(*) |
474-
expr_assign_op(*) | expr_mac(*) | expr_struct(*) {
473+
expr_block(*) | expr_move(*) | expr_unary_move(*) | expr_assign(*) |
474+
expr_swap(*) | expr_assign_op(*) | expr_mac(*) | expr_struct(*) => {
475475
visit::visit_expr(expr, self, vt);
476476
}
477477
}
@@ -1104,6 +1104,7 @@ class liveness {
11041104
expr_assert(e) |
11051105
expr_addr_of(_, e) |
11061106
expr_copy(e) |
1107+
expr_unary_move(e) |
11071108
expr_loop_body(e) |
11081109
expr_do_body(e) |
11091110
expr_cast(e, _) |
@@ -1430,6 +1431,12 @@ fn check_expr(expr: @expr, &&self: @liveness, vt: vt<@liveness>) {
14301431
visit::visit_expr(expr, self, vt);
14311432
}
14321433

1434+
expr_unary_move(r) {
1435+
self.check_move_from_expr(r, vt);
1436+
1437+
visit::visit_expr(expr, self, vt);
1438+
}
1439+
14331440
expr_assign_op(_, l, _) {
14341441
self.check_lvalue(l, vt);
14351442

src/rustc/middle/trans/base.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3682,7 +3682,7 @@ fn trans_expr(bcx: block, e: @ast::expr, dest: dest) -> block {
36823682
ast::expr_do_body(blk) {
36833683
ret trans_expr(bcx, blk, dest);
36843684
}
3685-
ast::expr_copy(a) {
3685+
ast::expr_copy(a) | ast::expr_unary_move(a) {
36863686
if !expr_is_lval(bcx, a) {
36873687
ret trans_expr(bcx, a, dest);
36883688
}

src/rustc/middle/trans/type_use.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ fn mark_for_expr(cx: ctx, e: @expr) {
158158
expr_rec(_, _) | expr_struct(*) | expr_tup(_) |
159159
expr_unary(box(_), _) | expr_unary(uniq(_), _) |
160160
expr_binary(add, _, _) |
161-
expr_copy(_) | expr_move(_, _) {
161+
expr_copy(_) | expr_move(_, _) | expr_unary_move(_) {
162162
node_type_needs(cx, use_repr, e.id);
163163
}
164164
expr_cast(base, _) {

src/rustc/middle/typeck/check.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1416,7 +1416,7 @@ fn check_expr_with_unifier(fcx: @fn_ctxt,
14161416
bot = check_expr_with(fcx, e, ty::mk_bool(tcx));
14171417
fcx.write_nil(id);
14181418
}
1419-
ast::expr_copy(a) {
1419+
ast::expr_copy(a) | ast::expr_unary_move(a) {
14201420
bot = check_expr(fcx, a, expected);
14211421
fcx.write_ty(id, fcx.expr_ty(a));
14221422
}

src/test/compile-fail/unary-move.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
// error-pattern: use of moved variable
2+
3+
fn main() {
4+
let x = 3;
5+
let y = move x;
6+
debug!("%d", x);
7+
}
8+

0 commit comments

Comments
 (0)