@@ -34,25 +34,33 @@ fn field_exprs(fields: [ast::field]) -> [@ast::expr] {
34
34
}
35
35
36
36
// Takes a predicate p, returns true iff p is true for any subexpressions
37
- // of b
38
- fn block_expr_query ( b : ast:: blk , p : fn @( ast:: expr_ ) -> bool ) -> bool {
37
+ // of b -- skipping any inner loops (loop, while, loop_body)
38
+ fn loop_query ( b : ast:: blk , p : fn @( ast:: expr_ ) -> bool ) -> bool {
39
39
let rs = @mut false ;
40
- let visit_expr = { |flag : @mut bool , e : @ast:: expr | * flag |= p ( e. node ) } ;
41
- let v =
42
- visit:: mk_simple_visitor ( @{ visit_expr: { |a|visit_expr ( rs, a) }
43
- with * visit:: default_simple_visitor ( ) } ) ;
44
- visit:: visit_block ( b, ( ) , v) ;
40
+ let visit_expr = { |e : @ast:: expr , & & flag: @mut bool ,
41
+ v : visit:: vt < @mut bool > |
42
+ * flag |= p ( e. node ) ;
43
+ alt e. node {
44
+ // Skip inner loops, since a break in the inner loop isn't a
45
+ // break inside the outer loop
46
+ ast:: expr_loop ( * ) | ast:: expr_while ( * ) | ast:: expr_loop_body ( * ) { }
47
+ _ { visit : : visit_expr ( e, flag, v) ; }
48
+ }
49
+ } ;
50
+ let v = visit:: mk_vt ( @{ visit_expr: visit_expr
51
+ with * visit:: default_visitor ( ) } ) ;
52
+ visit:: visit_block ( b, rs, v) ;
45
53
ret * rs;
46
54
}
47
55
48
56
fn has_nonlocal_exits ( b : ast:: blk ) -> bool {
49
- block_expr_query ( b) { |e| alt e {
57
+ loop_query ( b) { |e| alt e {
50
58
ast : : expr_break | ast:: expr_cont { true }
51
59
_ { false } } }
52
60
}
53
61
54
62
fn may_break ( b : ast:: blk ) -> bool {
55
- block_expr_query ( b) { |e| alt e {
63
+ loop_query ( b) { |e| alt e {
56
64
ast : : expr_break { true }
57
65
_ { false } } }
58
66
}
0 commit comments