@@ -1548,13 +1548,9 @@ impl<'a: 'ast, 'b, 'ast> LateResolutionVisitor<'a, 'b, 'ast> {
1548
1548
1549
1549
/// Searches the current set of local scopes for labels. Returns the `NodeId` of the resolved
1550
1550
/// label and reports an error if the label is not found or is unreachable.
1551
- fn resolve_label ( & mut self , mut label : Ident ) -> Option < NodeId > {
1551
+ fn resolve_label ( & mut self , mut label : Ident ) -> Result < ( NodeId , Span ) , ResolutionError < ' a > > {
1552
1552
let mut suggestion = None ;
1553
1553
1554
- // Preserve the original span so that errors contain "in this macro invocation"
1555
- // information.
1556
- let original_span = label. span ;
1557
-
1558
1554
for i in ( 0 ..self . label_ribs . len ( ) ) . rev ( ) {
1559
1555
let rib = & self . label_ribs [ i] ;
1560
1556
@@ -1570,18 +1566,13 @@ impl<'a: 'ast, 'b, 'ast> LateResolutionVisitor<'a, 'b, 'ast> {
1570
1566
if let Some ( ( ident, id) ) = rib. bindings . get_key_value ( & ident) {
1571
1567
let definition_span = ident. span ;
1572
1568
return if self . is_label_valid_from_rib ( i) {
1573
- Some ( * id)
1569
+ Ok ( ( * id, definition_span ) )
1574
1570
} else {
1575
- self . report_error (
1576
- original_span,
1577
- ResolutionError :: UnreachableLabel {
1578
- name : label. name ,
1579
- definition_span,
1580
- suggestion,
1581
- } ,
1582
- ) ;
1583
-
1584
- None
1571
+ Err ( ResolutionError :: UnreachableLabel {
1572
+ name : label. name ,
1573
+ definition_span,
1574
+ suggestion,
1575
+ } )
1585
1576
} ;
1586
1577
}
1587
1578
@@ -1590,11 +1581,7 @@ impl<'a: 'ast, 'b, 'ast> LateResolutionVisitor<'a, 'b, 'ast> {
1590
1581
suggestion = suggestion. or_else ( || self . suggestion_for_label_in_rib ( i, label) ) ;
1591
1582
}
1592
1583
1593
- self . report_error (
1594
- original_span,
1595
- ResolutionError :: UndeclaredLabel { name : label. name , suggestion } ,
1596
- ) ;
1597
- None
1584
+ Err ( ResolutionError :: UndeclaredLabel { name : label. name , suggestion } )
1598
1585
}
1599
1586
1600
1587
/// Determine whether or not a label from the `rib_index`th label rib is reachable.
@@ -3152,17 +3139,12 @@ impl<'a: 'ast, 'b, 'ast> LateResolutionVisitor<'a, 'b, 'ast> {
3152
3139
self . diagnostic_metadata . unused_labels . insert ( id, label. ident . span ) ;
3153
3140
}
3154
3141
3155
- let ident = label. ident . normalize_to_macro_rules ( ) ;
3156
- for rib in self . label_ribs . iter_mut ( ) . rev ( ) {
3157
- if let Some ( ( & orig_ident, _) ) = rib. bindings . get_key_value ( & ident) {
3158
- diagnostics:: signal_label_shadowing ( self . r . session , orig_ident, label. ident )
3159
- }
3160
- if rib. kind . is_label_barrier ( ) {
3161
- break ;
3162
- }
3142
+ if let Ok ( ( _, orig_span) ) = self . resolve_label ( label. ident ) {
3143
+ diagnostics:: signal_label_shadowing ( self . r . session , orig_span, label. ident )
3163
3144
}
3164
3145
3165
3146
self . with_label_rib ( NormalRibKind , |this| {
3147
+ let ident = label. ident . normalize_to_macro_rules ( ) ;
3166
3148
this. label_ribs . last_mut ( ) . unwrap ( ) . bindings . insert ( ident, id) ;
3167
3149
f ( this) ;
3168
3150
} ) ;
@@ -3266,10 +3248,15 @@ impl<'a: 'ast, 'b, 'ast> LateResolutionVisitor<'a, 'b, 'ast> {
3266
3248
}
3267
3249
3268
3250
ExprKind :: Break ( Some ( label) , _) | ExprKind :: Continue ( Some ( label) ) => {
3269
- if let Some ( node_id) = self . resolve_label ( label. ident ) {
3270
- // Since this res is a label, it is never read.
3271
- self . r . label_res_map . insert ( expr. id , node_id) ;
3272
- self . diagnostic_metadata . unused_labels . remove ( & node_id) ;
3251
+ match self . resolve_label ( label. ident ) {
3252
+ Ok ( ( node_id, _) ) => {
3253
+ // Since this res is a label, it is never read.
3254
+ self . r . label_res_map . insert ( expr. id , node_id) ;
3255
+ self . diagnostic_metadata . unused_labels . remove ( & node_id) ;
3256
+ }
3257
+ Err ( error) => {
3258
+ self . report_error ( label. ident . span , error) ;
3259
+ }
3273
3260
}
3274
3261
3275
3262
// visit `break` argument if any
0 commit comments