about summary refs log tree commit diff
path: root/src/librustsyntax
diff options
context:
space:
mode:
authorNiko Matsakis <niko@alum.mit.edu>2012-05-07 11:31:57 -0700
committerNiko Matsakis <niko@alum.mit.edu>2012-05-07 13:22:42 -0700
commit8a9df5aa38f63c9864dc560baadec95575188997 (patch)
tree6161c200d9bd6a494d3a2827699e4e74439b5bf9 /src/librustsyntax
parentd709ed2542d25a9dfcda40492412bb99155c8dea (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.rs2
-rw-r--r--src/librustsyntax/parse/parser.rs9
-rw-r--r--src/librustsyntax/print/pprust.rs4
-rw-r--r--src/librustsyntax/visit.rs18
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); }