@@ -139,6 +139,8 @@ pub fn expand_expr(e: @ast::Expr, fld: &mut MacroExpander) -> @ast::Expr {
139139 // Expand any interior macros etc.
140140 // NB: we don't fold pats yet. Curious.
141141 let src_expr = fld. fold_expr ( src_expr) . clone ( ) ;
142+ // Rename label before expansion.
143+ let ( opt_ident, src_loop_block) = rename_loop_label ( opt_ident, src_loop_block, fld) ;
142144 let src_loop_block = fld. fold_block ( src_loop_block) ;
143145
144146 let span = e. span ;
@@ -165,8 +167,7 @@ pub fn expand_expr(e: @ast::Expr, fld: &mut MacroExpander) -> @ast::Expr {
165167
166168 // `None => break ['<ident>];`
167169 let none_arm = {
168- // FIXME #6993: this map goes away:
169- let break_expr = fld. cx . expr ( span, ast:: ExprBreak ( opt_ident. map ( |x| x. name ) ) ) ;
170+ let break_expr = fld. cx . expr ( span, ast:: ExprBreak ( opt_ident) ) ;
170171 let none_pat = fld. cx . pat_ident ( span, none_ident) ;
171172 fld. cx . arm ( span, ~[ none_pat] , break_expr)
172173 } ;
@@ -199,10 +200,36 @@ pub fn expand_expr(e: @ast::Expr, fld: &mut MacroExpander) -> @ast::Expr {
199200 fld. cx . expr_match ( span, discrim, ~[ arm] )
200201 }
201202
203+ ast:: ExprLoop ( loop_block, opt_ident) => {
204+ let ( opt_ident, loop_block) =
205+ rename_loop_label ( opt_ident, loop_block, fld) ;
206+ let loop_block = fld. fold_block ( loop_block) ;
207+ fld. cx . expr ( e. span , ast:: ExprLoop ( loop_block, opt_ident) )
208+ }
209+
202210 _ => noop_fold_expr ( e, fld)
203211 }
204212}
205213
214+ // Rename loop label and its all occurrences inside the loop body
215+ fn rename_loop_label ( opt_ident : Option < Ident > ,
216+ loop_block : P < Block > ,
217+ fld : & mut MacroExpander ) -> ( Option < Ident > , P < Block > ) {
218+ match opt_ident {
219+ Some ( label) => {
220+ // Generate fresh label and add to the existing pending renames
221+ let new_label = fresh_name ( & label) ;
222+ let rename = ( label, new_label) ;
223+ fld. extsbox . info ( ) . pending_renames . push ( rename) ;
224+ let mut pending_renames = ~[ rename] ;
225+ let mut rename_fld = renames_to_fold ( & mut pending_renames) ;
226+ ( Some ( rename_fld. fold_ident ( label) ) ,
227+ rename_fld. fold_block ( loop_block) )
228+ }
229+ None => ( None , loop_block)
230+ }
231+ }
232+
206233// eval $e with a new exts frame:
207234macro_rules! with_exts_frame (
208235 ( $extsboxexpr: expr, $macros_escape: expr, $e: expr) =>
0 commit comments