@@ -139,6 +139,8 @@ pub fn expand_expr(e: @ast::Expr, fld: &mut MacroExpander) -> @ast::Expr {
139
139
// Expand any interior macros etc.
140
140
// NB: we don't fold pats yet. Curious.
141
141
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) ;
142
144
let src_loop_block = fld. fold_block ( src_loop_block) ;
143
145
144
146
let span = e. span ;
@@ -165,8 +167,7 @@ pub fn expand_expr(e: @ast::Expr, fld: &mut MacroExpander) -> @ast::Expr {
165
167
166
168
// `None => break ['<ident>];`
167
169
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) ) ;
170
171
let none_pat = fld. cx . pat_ident ( span, none_ident) ;
171
172
fld. cx . arm ( span, ~[ none_pat] , break_expr)
172
173
} ;
@@ -199,10 +200,36 @@ pub fn expand_expr(e: @ast::Expr, fld: &mut MacroExpander) -> @ast::Expr {
199
200
fld. cx . expr_match ( span, discrim, ~[ arm] )
200
201
}
201
202
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
+
202
210
_ => noop_fold_expr ( e, fld)
203
211
}
204
212
}
205
213
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
+
206
233
// eval $e with a new exts frame:
207
234
macro_rules! with_exts_frame (
208
235
( $extsboxexpr: expr, $macros_escape: expr, $e: expr) =>
0 commit comments