Skip to content

Commit 802a826

Browse files
committed
Stabilize static_recursion
1 parent fc6f092 commit 802a826

8 files changed

+8
-94
lines changed

src/librustc_passes/static_recursion.rs

+6-18
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ use rustc::hir::def::{Def, CtorKind};
1818
use rustc::util::nodemap::{NodeMap, NodeSet};
1919

2020
use syntax::ast;
21-
use syntax::feature_gate::{GateIssue, emit_feature_err};
2221
use syntax_pos::Span;
2322
use rustc::hir::intravisit::{self, Visitor, NestedVisitorMap};
2423
use rustc::hir;
@@ -43,7 +42,7 @@ impl<'a, 'hir: 'a> Visitor<'hir> for CheckCrateVisitor<'a, 'hir> {
4342
match it.node {
4443
hir::ItemStatic(..) |
4544
hir::ItemConst(..) => {
46-
let mut recursion_visitor = CheckItemRecursionVisitor::new(self, &it.span);
45+
let mut recursion_visitor = CheckItemRecursionVisitor::new(self);
4746
recursion_visitor.visit_item(it);
4847
}
4948
hir::ItemEnum(ref enum_def, ref generics) => {
@@ -52,8 +51,7 @@ impl<'a, 'hir: 'a> Visitor<'hir> for CheckCrateVisitor<'a, 'hir> {
5251
// less redundant output.
5352
for variant in &enum_def.variants {
5453
if let Some(_) = variant.node.disr_expr {
55-
let mut recursion_visitor = CheckItemRecursionVisitor::new(self,
56-
&variant.span);
54+
let mut recursion_visitor = CheckItemRecursionVisitor::new(self);
5755
recursion_visitor.populate_enum_discriminants(enum_def);
5856
recursion_visitor.visit_variant(variant, generics, it.id);
5957
}
@@ -68,7 +66,7 @@ impl<'a, 'hir: 'a> Visitor<'hir> for CheckCrateVisitor<'a, 'hir> {
6866
match ti.node {
6967
hir::TraitItemKind::Const(_, ref default) => {
7068
if let Some(_) = *default {
71-
let mut recursion_visitor = CheckItemRecursionVisitor::new(self, &ti.span);
69+
let mut recursion_visitor = CheckItemRecursionVisitor::new(self);
7270
recursion_visitor.visit_trait_item(ti);
7371
}
7472
}
@@ -80,7 +78,7 @@ impl<'a, 'hir: 'a> Visitor<'hir> for CheckCrateVisitor<'a, 'hir> {
8078
fn visit_impl_item(&mut self, ii: &'hir hir::ImplItem) {
8179
match ii.node {
8280
hir::ImplItemKind::Const(..) => {
83-
let mut recursion_visitor = CheckItemRecursionVisitor::new(self, &ii.span);
81+
let mut recursion_visitor = CheckItemRecursionVisitor::new(self);
8482
recursion_visitor.visit_impl_item(ii);
8583
}
8684
_ => {}
@@ -105,7 +103,6 @@ pub fn check_crate<'hir>(sess: &Session, hir_map: &hir_map::Map<'hir>) -> Compil
105103
}
106104

107105
struct CheckItemRecursionVisitor<'a, 'b: 'a, 'hir: 'b> {
108-
root_span: &'b Span,
109106
sess: &'b Session,
110107
hir_map: &'b hir_map::Map<'hir>,
111108
discriminant_map: &'a mut NodeMap<Option<hir::BodyId>>,
@@ -114,9 +111,8 @@ struct CheckItemRecursionVisitor<'a, 'b: 'a, 'hir: 'b> {
114111
}
115112

116113
impl<'a, 'b: 'a, 'hir: 'b> CheckItemRecursionVisitor<'a, 'b, 'hir> {
117-
fn new(v: &'a mut CheckCrateVisitor<'b, 'hir>, span: &'b Span) -> Self {
114+
fn new(v: &'a mut CheckCrateVisitor<'b, 'hir>) -> Self {
118115
CheckItemRecursionVisitor {
119-
root_span: span,
120116
sess: v.sess,
121117
hir_map: v.hir_map,
122118
discriminant_map: &mut v.discriminant_map,
@@ -143,15 +139,7 @@ impl<'a, 'b: 'a, 'hir: 'b> CheckItemRecursionVisitor<'a, 'b, 'hir> {
143139
false
144140
}
145141
});
146-
if any_static {
147-
if !self.sess.features.borrow().static_recursion {
148-
emit_feature_err(&self.sess.parse_sess,
149-
"static_recursion",
150-
*self.root_span,
151-
GateIssue::Language,
152-
"recursive static");
153-
}
154-
} else {
142+
if !any_static {
155143
struct_span_err!(self.sess, span, E0265, "recursive constant")
156144
.span_label(span, &format!("recursion not allowed in constant"))
157145
.emit();

src/libsyntax/feature_gate.rs

+2-3
Original file line numberDiff line numberDiff line change
@@ -197,9 +197,6 @@ declare_features! (
197197
// rustc internal
198198
(active, prelude_import, "1.2.0", None),
199199

200-
// Allows the definition recursive static items.
201-
(active, static_recursion, "1.3.0", Some(29719)),
202-
203200
// Allows default type parameters to influence type inference.
204201
(active, default_type_parameter_fallback, "1.3.0", Some(27336)),
205202

@@ -384,6 +381,8 @@ declare_features! (
384381
(accepted, static_in_const, "1.17.0", Some(35897)),
385382
// Allows field shorthands (`x` meaning `x: x`) in struct literal expressions.
386383
(accepted, field_init_shorthand, "1.17.0", Some(37340)),
384+
// Allows the definition recursive static items.
385+
(accepted, static_recursion, "1.17.0", Some(29719)),
387386
);
388387
// (changing above list without updating src/doc/reference.md makes @cmr sad)
389388

src/test/compile-fail/feature-gate-static_recursion.rs

-49
This file was deleted.

src/test/compile-fail/issue-3008-2.rs

-2
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,6 @@
88
// option. This file may not be copied, modified, or distributed
99
// except according to those terms.
1010

11-
#![feature(static_recursion)]
12-
1311
enum foo { foo_(bar) }
1412
struct bar { x: bar }
1513
//~^ ERROR E0072

src/test/compile-fail/static-recursion-gate.rs

-16
This file was deleted.

src/test/run-pass/issue-2063-resource.rs

-2
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,6 @@
88
// option. This file may not be copied, modified, or distributed
99
// except according to those terms.
1010

11-
#![feature(static_recursion)]
12-
1311
// test that autoderef of a type like this does not
1412
// cause compiler to loop. Note that no instances
1513
// of such a type could ever be constructed.

src/test/run-pass/issue-2063.rs

-2
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,6 @@
88
// option. This file may not be copied, modified, or distributed
99
// except according to those terms.
1010

11-
#![feature(static_recursion)]
12-
1311
// test that autoderef of a type like this does not
1412
// cause compiler to loop. Note that no instances
1513
// of such a type could ever be constructed.

src/test/run-pass/static-recursive.rs

-2
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,6 @@
88
// option. This file may not be copied, modified, or distributed
99
// except according to those terms.
1010

11-
#![feature(static_recursion)]
12-
1311
static mut S: *const u8 = unsafe { &S as *const *const u8 as *const u8 };
1412

1513
struct StaticDoubleLinked {

0 commit comments

Comments
 (0)