@@ -112,7 +112,7 @@ fn visit_expr(cx: @ctx, ex: @ast::expr, sc: scope, v: vt<scope>) {
112
112
}
113
113
ast:: expr_alt ( input, arms, _) { check_alt ( * cx, input, arms, sc, v) ; }
114
114
ast:: expr_for ( decl, seq, blk) {
115
- v . visit_expr ( seq, sc, v) ;
115
+ visit_expr ( cx , seq, sc, v) ;
116
116
check_loop ( * cx, sc) { || check_for ( * cx, decl, seq, blk, sc, v) ; }
117
117
}
118
118
ast:: expr_path ( pt) {
@@ -125,11 +125,13 @@ fn visit_expr(cx: @ctx, ex: @ast::expr, sc: scope, v: vt<scope>) {
125
125
handled = false ;
126
126
}
127
127
ast:: expr_move ( dest, src) {
128
- check_assign ( cx, dest, src, sc, v) ;
128
+ visit_expr ( cx, src, sc, v) ;
129
+ check_lval ( cx, dest, sc, v) ;
129
130
check_lval ( cx, src, sc, v) ;
130
131
}
131
132
ast:: expr_assign ( dest, src) | ast:: expr_assign_op ( _, dest, src) {
132
- check_assign ( cx, dest, src, sc, v) ;
133
+ visit_expr ( cx, src, sc, v) ;
134
+ check_lval ( cx, dest, sc, v) ;
133
135
}
134
136
ast:: expr_if ( c, then, els) { check_if ( c, then, els, sc, v) ; }
135
137
ast:: expr_while ( _, _) | ast:: expr_do_while ( _, _) {
@@ -153,6 +155,8 @@ fn visit_block(cx: @ctx, b: ast::blk, sc: scope, v: vt<scope>) {
153
155
some ( init) {
154
156
if init. op == ast:: init_move {
155
157
check_lval ( cx, init. expr , sc, v) ;
158
+ } else {
159
+ visit_expr ( cx, init. expr , sc, v) ;
156
160
}
157
161
}
158
162
none { }
@@ -354,7 +358,7 @@ fn check_alt(cx: ctx, input: @ast::expr, arms: [ast::arm], sc: scope,
354
358
}
355
359
* sc. invalid = orig_invalid;
356
360
visit:: visit_arm ( a, { bs: new_bs with sc} , v) ;
357
- all_invalid = append_invalid ( all_invalid, * sc. invalid , orig_invalid ) ;
361
+ all_invalid = join_invalid ( all_invalid, * sc. invalid ) ;
358
362
}
359
363
* sc. invalid = all_invalid;
360
364
}
@@ -423,12 +427,6 @@ fn check_lval(cx: @ctx, dest: @ast::expr, sc: scope, v: vt<scope>) {
423
427
}
424
428
}
425
429
426
- fn check_assign ( cx : @ctx , dest : @ast:: expr , src : @ast:: expr , sc : scope ,
427
- v : vt < scope > ) {
428
- visit_expr ( cx, src, sc, v) ;
429
- check_lval ( cx, dest, sc, v) ;
430
- }
431
-
432
430
fn check_if ( c : @ast:: expr , then : ast:: blk , els : option < @ast:: expr > ,
433
431
sc : scope , v : vt < scope > ) {
434
432
v. visit_expr ( c, sc, v) ;
@@ -437,7 +435,7 @@ fn check_if(c: @ast::expr, then: ast::blk, els: option<@ast::expr>,
437
435
let then_invalid = * sc. invalid ;
438
436
* sc. invalid = orig_invalid;
439
437
visit:: visit_expr_opt ( els, sc, v) ;
440
- * sc. invalid = append_invalid ( * sc. invalid , then_invalid, orig_invalid ) ;
438
+ * sc. invalid = join_invalid ( * sc. invalid , then_invalid) ;
441
439
}
442
440
443
441
fn check_loop ( cx : ctx , sc : scope , checker : fn ( ) ) {
@@ -672,24 +670,14 @@ fn find_invalid(id: node_id, lst: list<@invalid>)
672
670
ret none;
673
671
}
674
672
675
- fn append_invalid ( dest : list < @invalid > , src : list < @invalid > ,
676
- stop : list < @invalid > ) -> list < @invalid > {
677
- let cur = src, dest = dest;
678
- while cur != stop {
679
- alt cur {
680
- list : : cons ( head, tail) {
681
- if is_none ( find_invalid ( head. node_id , dest) ) {
682
- dest = list:: cons ( head, @dest) ;
683
- }
684
- cur = * tail;
685
- }
686
- list:: nil {
687
- fail "append_invalid: stop doesn't appear to be \
688
- a postfix of src";
689
- }
690
- }
673
+ fn join_invalid ( a : list < @invalid > , b : list < @invalid > ) -> list < @invalid > {
674
+ let result = a;
675
+ list:: iter ( b) { |elt|
676
+ let found = false ;
677
+ list:: iter ( a) { |e| if e == elt { found = true ; } }
678
+ if !found { result = list:: cons ( elt, @result) ; }
691
679
}
692
- ret dest ;
680
+ result
693
681
}
694
682
695
683
fn filter_invalid ( src : list < @invalid > , bs : [ binding ] ) -> list < @invalid > {
0 commit comments