about summary refs log tree commit diff
path: root/src/libsyntax
diff options
context:
space:
mode:
authorNiko Matsakis <niko@alum.mit.edu>2012-08-23 14:46:59 -0700
committerNiko Matsakis <niko@alum.mit.edu>2012-08-23 18:54:08 -0700
commita08f3a7d4d937c2b26c8a29edabe7fb089d0b5f7 (patch)
tree778e2d94eca68fd3e579b2ad8ac2725602afe340 /src/libsyntax
parent83e7c869bdfadf0ed8aca92e76fc5073b63402e2 (diff)
downloadrust-a08f3a7d4d937c2b26c8a29edabe7fb089d0b5f7.tar.gz
rust-a08f3a7d4d937c2b26c8a29edabe7fb089d0b5f7.zip
More complete fix to #3162 (borrowck bug related to access to rec fields)
Diffstat (limited to 'src/libsyntax')
-rw-r--r--src/libsyntax/ext/simplext.rs9
-rw-r--r--src/libsyntax/parse/common.rs15
2 files changed, 9 insertions, 15 deletions
diff --git a/src/libsyntax/ext/simplext.rs b/src/libsyntax/ext/simplext.rs
index 7c37312a433..586a428c1d7 100644
--- a/src/libsyntax/ext/simplext.rs
+++ b/src/libsyntax/ext/simplext.rs
@@ -205,10 +205,10 @@ fn transcribe(cx: ext_ctxt, b: bindings, body: @expr) -> @expr {
 
 
 /* helper: descend into a matcher */
-fn follow(m: arb_depth<matchable>, idx_path: @mut ~[uint]) ->
+pure fn follow(m: arb_depth<matchable>, idx_path: &[uint]) ->
    arb_depth<matchable> {
     let mut res: arb_depth<matchable> = m;
-    for vec::each(*idx_path) |idx| {
+    for vec::each(idx_path) |idx| {
         res = match res {
           leaf(_) => return res,/* end of the line */
           seq(new_ms, _) => new_ms[idx]
@@ -222,7 +222,7 @@ fn follow_for_trans(cx: ext_ctxt, mmaybe: option<arb_depth<matchable>>,
     match mmaybe {
       none => return none,
       some(m) => {
-        return match follow(m, idx_path) {
+        return match follow(m, *idx_path) {
               seq(_, sp) => {
                 cx.span_fatal(sp,
                               ~"syntax matched under ... but not " +
@@ -274,7 +274,8 @@ fn transcribe_exprs(cx: ext_ctxt, b: bindings, idx_path: @mut ~[uint],
             /* we need to walk over all the free vars in lockstep, except for
             the leaves, which are just duplicated */
             do free_vars(b, repeat_me) |fv| {
-                let cur_pos = follow(b.get(fv), idx_path);
+                let fv_depth = b.get(fv);
+                let cur_pos = follow(fv_depth, *idx_path);
                 match cur_pos {
                   leaf(_) => (),
                   seq(ms, _) => {
diff --git a/src/libsyntax/parse/common.rs b/src/libsyntax/parse/common.rs
index afb9c91fc8d..e68a8120992 100644
--- a/src/libsyntax/parse/common.rs
+++ b/src/libsyntax/parse/common.rs
@@ -146,19 +146,12 @@ impl parser: parser_common {
 
     fn eat_keyword(word: ~str) -> bool {
         self.require_keyword(word);
-
-        let mut bump = false;
-        let val = match self.token {
-          token::IDENT(sid, false) => {
-            if word == *self.id_to_str(sid) {
-                bump = true;
-                true
-            } else { false }
-          }
+        let is_kw = match self.token {
+          token::IDENT(sid, false) => (word == *self.id_to_str(sid)),
           _ => false
         };
-        if bump { self.bump() }
-        val
+        if is_kw { self.bump() }
+        is_kw
     }
 
     fn expect_keyword(word: ~str) {