Skip to content

Commit 6631d8e

Browse files
author
Jonathan Turner
authored
Rollup merge of #36147 - mikhail-m1:master, r=jonathandturner
update E0265 to new format Fixes #35309 as part of #35233. I've describe partially bonus achieve in #35309 r? @jonathandturner
2 parents 93c5d6c + 507fe14 commit 6631d8e

File tree

2 files changed

+16
-6
lines changed

2 files changed

+16
-6
lines changed

src/librustc_passes/static_recursion.rs

+8-6
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ impl<'a, 'ast: 'a> CheckItemRecursionVisitor<'a, 'ast> {
126126
idstack: Vec::new(),
127127
}
128128
}
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)
130130
where F: Fn(&mut Self)
131131
{
132132
if self.idstack.iter().any(|&x| x == id) {
@@ -150,7 +150,9 @@ impl<'a, 'ast: 'a> CheckItemRecursionVisitor<'a, 'ast> {
150150
"recursive static");
151151
}
152152
} 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();
154156
}
155157
return;
156158
}
@@ -203,7 +205,7 @@ impl<'a, 'ast: 'a> CheckItemRecursionVisitor<'a, 'ast> {
203205

204206
impl<'a, 'ast: 'a> Visitor<'ast> for CheckItemRecursionVisitor<'a, 'ast> {
205207
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);
207209
}
208210

209211
fn visit_enum_def(&mut self,
@@ -233,16 +235,16 @@ impl<'a, 'ast: 'a> Visitor<'ast> for CheckItemRecursionVisitor<'a, 'ast> {
233235
// If `maybe_expr` is `None`, that's because no discriminant is
234236
// specified that affects this variant. Thus, no risk of recursion.
235237
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);
237239
}
238240
}
239241

240242
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);
242244
}
243245

244246
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);
246248
}
247249

248250
fn visit_expr(&mut self, e: &'ast hir::Expr) {

src/test/compile-fail/issue-23302.rs

+8
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,21 @@
1212
// the appropriate error (rather than, say, blowing the stack).
1313
enum X {
1414
A = X::A as isize, //~ ERROR E0265
15+
//~^ NOTE recursion not allowed in constant
1516
}
1617

1718
// Since `Y::B` here defaults to `Y::A+1`, this is also a
1819
// recursive definition.
1920
enum Y {
2021
A = Y::B as isize, //~ ERROR E0265
22+
//~^ NOTE recursion not allowed in constant
2123
B,
2224
}
2325

26+
const A: i32 = B; //~ ERROR E0265
27+
//~^ NOTE recursion not allowed in constant
28+
29+
const B: i32 = A; //~ ERROR E0265
30+
//~^ NOTE recursion not allowed in constant
31+
2432
fn main() { }

0 commit comments

Comments
 (0)