@@ -126,7 +126,7 @@ impl<'a, 'ast: 'a> CheckItemRecursionVisitor<'a, 'ast> {
126
126
idstack : Vec :: new ( ) ,
127
127
}
128
128
}
129
- fn with_item_id_pushed < F > ( & mut self , id : ast:: NodeId , f : F )
129
+ fn with_item_id_pushed < F > ( & mut self , id : ast:: NodeId , f : F , span : Span )
130
130
where F : Fn ( & mut Self )
131
131
{
132
132
if self . idstack . iter ( ) . any ( |& x| x == id) {
@@ -150,7 +150,9 @@ impl<'a, 'ast: 'a> CheckItemRecursionVisitor<'a, 'ast> {
150
150
"recursive static" ) ;
151
151
}
152
152
} else {
153
- span_err ! ( self . sess, * self . root_span, E0265 , "recursive constant" ) ;
153
+ struct_span_err ! ( self . sess, span, E0265 , "recursive constant" )
154
+ . span_label ( span, & format ! ( "recursion not allowed in constant" ) )
155
+ . emit ( ) ;
154
156
}
155
157
return ;
156
158
}
@@ -203,7 +205,7 @@ impl<'a, 'ast: 'a> CheckItemRecursionVisitor<'a, 'ast> {
203
205
204
206
impl < ' a , ' ast : ' a > Visitor < ' ast > for CheckItemRecursionVisitor < ' a , ' ast > {
205
207
fn visit_item ( & mut self , it : & ' ast hir:: Item ) {
206
- self . with_item_id_pushed ( it. id , |v| intravisit:: walk_item ( v, it) ) ;
208
+ self . with_item_id_pushed ( it. id , |v| intravisit:: walk_item ( v, it) , it . span ) ;
207
209
}
208
210
209
211
fn visit_enum_def ( & mut self ,
@@ -233,16 +235,16 @@ impl<'a, 'ast: 'a> Visitor<'ast> for CheckItemRecursionVisitor<'a, 'ast> {
233
235
// If `maybe_expr` is `None`, that's because no discriminant is
234
236
// specified that affects this variant. Thus, no risk of recursion.
235
237
if let Some ( expr) = maybe_expr {
236
- self . with_item_id_pushed ( expr. id , |v| intravisit:: walk_expr ( v, expr) ) ;
238
+ self . with_item_id_pushed ( expr. id , |v| intravisit:: walk_expr ( v, expr) , expr . span ) ;
237
239
}
238
240
}
239
241
240
242
fn visit_trait_item ( & mut self , ti : & ' ast hir:: TraitItem ) {
241
- self . with_item_id_pushed ( ti. id , |v| intravisit:: walk_trait_item ( v, ti) ) ;
243
+ self . with_item_id_pushed ( ti. id , |v| intravisit:: walk_trait_item ( v, ti) , ti . span ) ;
242
244
}
243
245
244
246
fn visit_impl_item ( & mut self , ii : & ' ast hir:: ImplItem ) {
245
- self . with_item_id_pushed ( ii. id , |v| intravisit:: walk_impl_item ( v, ii) ) ;
247
+ self . with_item_id_pushed ( ii. id , |v| intravisit:: walk_impl_item ( v, ii) , ii . span ) ;
246
248
}
247
249
248
250
fn visit_expr ( & mut self , e : & ' ast hir:: Expr ) {
0 commit comments