about summary refs log tree commit diff
path: root/src/libsyntax
diff options
context:
space:
mode:
authorNiko Matsakis <niko@alum.mit.edu>2013-05-22 06:54:35 -0400
committerNiko Matsakis <niko@alum.mit.edu>2013-05-28 20:22:14 -0400
commit5851d3242cce2a53fc25df21ab5ad20dc1fd6a62 (patch)
treee20309eda47cbc2e59df1d1d132130dc93b7411c /src/libsyntax
parent5676056ae6dd3a10d2c7323375ace3ca2fe1c308 (diff)
downloadrust-5851d3242cce2a53fc25df21ab5ad20dc1fd6a62.tar.gz
rust-5851d3242cce2a53fc25df21ab5ad20dc1fd6a62.zip
Move checking for moves and initialization of local variables and patterns into
borrow checker and generalize what moves are allowed. Fixes a nasty
bug or two in the pattern move checking code. Unifies dataflow code
used for initialization and other things. First step towards
once fns. Everybody wins.

Fixes #4384. Fixes #4715. cc once fns (#2202), optimizing local moves (#5016).
Diffstat (limited to 'src/libsyntax')
-rw-r--r--src/libsyntax/ast_util.rs31
1 files changed, 13 insertions, 18 deletions
diff --git a/src/libsyntax/ast_util.rs b/src/libsyntax/ast_util.rs
index 8d5af682d62..ba56d544880 100644
--- a/src/libsyntax/ast_util.rs
+++ b/src/libsyntax/ast_util.rs
@@ -527,36 +527,31 @@ pub fn is_item_impl(item: @ast::item) -> bool {
     }
 }
 
-pub fn walk_pat(pat: @pat, it: &fn(@pat)) {
-    it(pat);
+pub fn walk_pat(pat: @pat, it: &fn(@pat) -> bool) -> bool {
+    if !it(pat) {
+        return false;
+    }
+
     match pat.node {
         pat_ident(_, _, Some(p)) => walk_pat(p, it),
         pat_struct(_, ref fields, _) => {
-            for fields.each |f| {
-                walk_pat(f.pat, it)
-            }
+            fields.each(|f| walk_pat(f.pat, it))
         }
         pat_enum(_, Some(ref s)) | pat_tup(ref s) => {
-            for s.each |p| {
-                walk_pat(*p, it)
-            }
+            s.each(|&p| walk_pat(p, it))
         }
         pat_box(s) | pat_uniq(s) | pat_region(s) => {
             walk_pat(s, it)
         }
         pat_vec(ref before, ref slice, ref after) => {
-            for before.each |p| {
-                walk_pat(*p, it)
-            }
-            for slice.each |p| {
-                walk_pat(*p, it)
-            }
-            for after.each |p| {
-                walk_pat(*p, it)
-            }
+            before.each(|&p| walk_pat(p, it)) &&
+                slice.each(|&p| walk_pat(p, it)) &&
+                after.each(|&p| walk_pat(p, it))
         }
         pat_wild | pat_lit(_) | pat_range(_, _) | pat_ident(_, _, _) |
-        pat_enum(_, _) => { }
+        pat_enum(_, _) => {
+            true
+        }
     }
 }