@@ -56,7 +56,7 @@ use rustc::util::nodemap::{NodeMap, NodeSet, FnvHashMap, FnvHashSet};
5656use syntax:: ext:: base:: MultiItemModifier ;
5757use syntax:: ext:: hygiene:: Mark ;
5858use syntax:: ast:: { self , FloatTy } ;
59- use syntax:: ast:: { CRATE_NODE_ID , Name , NodeId , IntTy , UintTy } ;
59+ use syntax:: ast:: { CRATE_NODE_ID , Name , NodeId , SpannedIdent , IntTy , UintTy } ;
6060use syntax:: parse:: token:: { self , keywords} ;
6161use syntax:: util:: lev_distance:: find_best_match_for_name;
6262
@@ -2237,7 +2237,7 @@ impl<'a> Resolver<'a> {
22372237 }
22382238
22392239 fn fresh_binding ( & mut self ,
2240- ident : & ast :: SpannedIdent ,
2240+ ident : & SpannedIdent ,
22412241 pat_id : NodeId ,
22422242 outer_pat_id : NodeId ,
22432243 pat_src : PatternSource ,
@@ -2803,11 +2803,11 @@ impl<'a> Resolver<'a> {
28032803 } SuggestionType :: NotFound
28042804 }
28052805
2806- fn resolve_labeled_block ( & mut self , label : Option < ast :: Ident > , id : NodeId , block : & Block ) {
2806+ fn resolve_labeled_block ( & mut self , label : Option < SpannedIdent > , id : NodeId , block : & Block ) {
28072807 if let Some ( label) = label {
28082808 let def = Def :: Label ( id) ;
28092809 self . with_label_rib ( |this| {
2810- this. label_ribs . last_mut ( ) . unwrap ( ) . bindings . insert ( label, def) ;
2810+ this. label_ribs . last_mut ( ) . unwrap ( ) . bindings . insert ( label. node , def) ;
28112811 this. visit_block ( block) ;
28122812 } ) ;
28132813 } else {
@@ -3006,19 +3006,6 @@ impl<'a> Resolver<'a> {
30063006 visit:: walk_expr ( self , expr) ;
30073007 }
30083008
3009- ExprKind :: Loop ( _, Some ( label) ) | ExprKind :: While ( .., Some ( label) ) => {
3010- self . with_label_rib ( |this| {
3011- let def = Def :: Label ( expr. id ) ;
3012-
3013- {
3014- let rib = this. label_ribs . last_mut ( ) . unwrap ( ) ;
3015- rib. bindings . insert ( label. node , def) ;
3016- }
3017-
3018- visit:: walk_expr ( this, expr) ;
3019- } )
3020- }
3021-
30223009 ExprKind :: Break ( Some ( label) ) | ExprKind :: Continue ( Some ( label) ) => {
30233010 match self . search_label ( label. node ) {
30243011 None => {
@@ -3048,12 +3035,19 @@ impl<'a> Resolver<'a> {
30483035 optional_else. as_ref ( ) . map ( |expr| self . visit_expr ( expr) ) ;
30493036 }
30503037
3038+ ExprKind :: Loop ( ref block, label) => self . resolve_labeled_block ( label, expr. id , & block) ,
3039+
3040+ ExprKind :: While ( ref subexpression, ref block, label) => {
3041+ self . visit_expr ( subexpression) ;
3042+ self . resolve_labeled_block ( label, expr. id , & block) ;
3043+ }
3044+
30513045 ExprKind :: WhileLet ( ref pattern, ref subexpression, ref block, label) => {
30523046 self . visit_expr ( subexpression) ;
30533047 self . value_ribs . push ( Rib :: new ( NormalRibKind ) ) ;
30543048 self . resolve_pattern ( pattern, PatternSource :: WhileLet , & mut FnvHashMap ( ) ) ;
30553049
3056- self . resolve_labeled_block ( label. map ( |l| l . node ) , expr. id , block) ;
3050+ self . resolve_labeled_block ( label, expr. id , block) ;
30573051
30583052 self . value_ribs . pop ( ) ;
30593053 }
@@ -3063,7 +3057,7 @@ impl<'a> Resolver<'a> {
30633057 self . value_ribs . push ( Rib :: new ( NormalRibKind ) ) ;
30643058 self . resolve_pattern ( pattern, PatternSource :: For , & mut FnvHashMap ( ) ) ;
30653059
3066- self . resolve_labeled_block ( label. map ( |l| l . node ) , expr. id , block) ;
3060+ self . resolve_labeled_block ( label, expr. id , block) ;
30673061
30683062 self . value_ribs . pop ( ) ;
30693063 }
0 commit comments