diff options
| author | Niko Matsakis <niko@alum.mit.edu> | 2012-05-07 11:31:57 -0700 |
|---|---|---|
| committer | Niko Matsakis <niko@alum.mit.edu> | 2012-05-07 13:22:42 -0700 |
| commit | 8a9df5aa38f63c9864dc560baadec95575188997 (patch) | |
| tree | 6161c200d9bd6a494d3a2827699e4e74439b5bf9 /src/librustsyntax | |
| parent | d709ed2542d25a9dfcda40492412bb99155c8dea (diff) | |
make it illegal to implicitly capture mutable variables
this is the final part of #1273
Diffstat (limited to 'src/librustsyntax')
| -rw-r--r-- | src/librustsyntax/ast.rs | 2 | ||||
| -rw-r--r-- | src/librustsyntax/parse/parser.rs | 9 | ||||
| -rw-r--r-- | src/librustsyntax/print/pprust.rs | 4 | ||||
| -rw-r--r-- | src/librustsyntax/visit.rs | 18 |
4 files changed, 18 insertions, 15 deletions
diff --git a/src/librustsyntax/ast.rs b/src/librustsyntax/ast.rs index 12e29bcc3ec..5c95a26f9a0 100644 --- a/src/librustsyntax/ast.rs +++ b/src/librustsyntax/ast.rs @@ -362,7 +362,7 @@ type capture_item = { }; #[auto_serialize] -type capture_clause = [capture_item]; +type capture_clause = @[capture_item]; /* // Says whether this is a block the user marked as diff --git a/src/librustsyntax/parse/parser.rs b/src/librustsyntax/parse/parser.rs index 0432faecba0..ec6dc734711 100644 --- a/src/librustsyntax/parse/parser.rs +++ b/src/librustsyntax/parse/parser.rs @@ -1187,7 +1187,8 @@ fn parse_fn_expr(p: parser, proto: ast::proto) -> @ast::expr { let body = parse_block(p); ret mk_expr(p, lo, body.span.hi, - ast::expr_fn(proto, decl, body, capture_clause + cc_old)); + ast::expr_fn(proto, decl, body, + @(*capture_clause + cc_old))); } fn parse_fn_block_expr(p: parser) -> @ast::expr { @@ -1679,7 +1680,7 @@ fn parse_ty_params(p: parser) -> [ast::ty_param] { } // FIXME Remove after snapshot -fn parse_old_skool_capture_clause(p: parser) -> ast::capture_clause { +fn parse_old_skool_capture_clause(p: parser) -> [ast::capture_item] { fn expect_opt_trailing_semi(p: parser) { if !eat(p, token::SEMI) { if p.token != token::RBRACKET { @@ -1739,7 +1740,7 @@ fn parse_fn_decl(p: parser, purity: ast::purity, parse_arg_fn, p).node; let inputs = either::lefts(args_or_capture_items); - let capture_clause = either::rights(args_or_capture_items); + let capture_clause = @either::rights(args_or_capture_items); // Use the args list to translate each bound variable // mentioned in a constraint to an arg index. @@ -1778,7 +1779,7 @@ fn parse_fn_block_decl(p: parser) -> (ast::fn_decl, ast::capture_clause) { purity: ast::impure_fn, cf: ast::return_val, constraints: []}, - either::rights(inputs_captures)); + @either::rights(inputs_captures)); } fn parse_fn_header(p: parser) -> {ident: ast::ident, tps: [ast::ty_param]} { diff --git a/src/librustsyntax/print/pprust.rs b/src/librustsyntax/print/pprust.rs index 6e573041265..beb6c32bcbe 100644 --- a/src/librustsyntax/print/pprust.rs +++ b/src/librustsyntax/print/pprust.rs @@ -1018,7 +1018,7 @@ fn print_expr(s: ps, &&expr: @ast::expr) { // head-box, will be closed by print-block at start ibox(s, 0u); word(s.s, proto_to_str(proto)); - print_fn_args_and_ret(s, decl, cap_clause); + print_fn_args_and_ret(s, decl, *cap_clause); space(s.s); print_block(s, body); } @@ -1028,7 +1028,7 @@ fn print_expr(s: ps, &&expr: @ast::expr) { // head-box, will be closed by print-block at start ibox(s, 0u); word(s.s, "{"); - print_fn_block_args(s, decl, cap_clause); + print_fn_block_args(s, decl, *cap_clause); print_possibly_embedded_block(s, body, block_block_fn, indent_unit); } ast::expr_loop_body(body) { diff --git a/src/librustsyntax/visit.rs b/src/librustsyntax/visit.rs index 2cac7f53e83..2468ab68aa3 100644 --- a/src/librustsyntax/visit.rs +++ b/src/librustsyntax/visit.rs @@ -16,8 +16,8 @@ enum fn_kind { fk_item_fn(ident, [ty_param]), //< an item declared with fn() fk_method(ident, [ty_param], @method), fk_res(ident, [ty_param], region_param), - fk_anon(proto), //< an anonymous function like fn@(...) - fk_fn_block, //< a block {||...} + fk_anon(proto, capture_clause), //< an anonymous function like fn@(...) + fk_fn_block(capture_clause), //< a block {||...} fk_ctor(ident, [ty_param], node_id /* self id */, def_id /* parent class id */) // class constructor } @@ -26,7 +26,7 @@ fn name_of_fn(fk: fn_kind) -> ident { alt fk { fk_item_fn(name, _) | fk_method(name, _, _) | fk_res(name, _, _) | fk_ctor(name, _, _, _) { name } - fk_anon(_) | fk_fn_block { "anon" } + fk_anon(*) | fk_fn_block(*) { "anon" } } } @@ -34,7 +34,7 @@ fn tps_of_fn(fk: fn_kind) -> [ty_param] { alt fk { fk_item_fn(_, tps) | fk_method(_, tps, _) | fk_res(_, tps, _) | fk_ctor(_, tps, _, _) { tps } - fk_anon(_) | fk_fn_block { [] } + fk_anon(*) | fk_fn_block(*) { [] } } } @@ -381,11 +381,13 @@ fn visit_expr<E>(ex: @expr, e: E, v: vt<E>) { v.visit_expr(x, e, v); for arms.each {|a| v.visit_arm(a, e, v); } } - expr_fn(proto, decl, body, _) { - v.visit_fn(fk_anon(proto), decl, body, ex.span, ex.id, e, v); + expr_fn(proto, decl, body, cap_clause) { + v.visit_fn(fk_anon(proto, cap_clause), decl, body, + ex.span, ex.id, e, v); } - expr_fn_block(decl, body, _) { - v.visit_fn(fk_fn_block, decl, body, ex.span, ex.id, e, v); + expr_fn_block(decl, body, cap_clause) { + v.visit_fn(fk_fn_block(cap_clause), decl, body, + ex.span, ex.id, e, v); } expr_block(b) { v.visit_block(b, e, v); } expr_assign(a, b) { v.visit_expr(b, e, v); v.visit_expr(a, e, v); } |
