pre-expansion gate box_patterns
This commit is contained in:
parent
1f470ceac2
commit
2aff6b36d7
7 changed files with 23 additions and 16 deletions
|
@ -510,10 +510,6 @@ impl<'a> Visitor<'a> for PostExpansionVisitor<'a> {
|
|||
visit::walk_expr(self, e)
|
||||
}
|
||||
|
||||
fn visit_arm(&mut self, arm: &'a ast::Arm) {
|
||||
visit::walk_arm(self, arm)
|
||||
}
|
||||
|
||||
fn visit_pat(&mut self, pattern: &'a ast::Pat) {
|
||||
match &pattern.kind {
|
||||
PatKind::Slice(pats) => {
|
||||
|
@ -533,11 +529,6 @@ impl<'a> Visitor<'a> for PostExpansionVisitor<'a> {
|
|||
}
|
||||
}
|
||||
}
|
||||
PatKind::Box(..) => {
|
||||
gate_feature_post!(&self, box_patterns,
|
||||
pattern.span,
|
||||
"box pattern syntax is experimental");
|
||||
}
|
||||
PatKind::Range(_, _, Spanned { node: RangeEnd::Excluded, .. }) => {
|
||||
gate_feature_post!(&self, exclusive_range_pattern, pattern.span,
|
||||
"exclusive range pattern syntax is experimental");
|
||||
|
@ -547,11 +538,7 @@ impl<'a> Visitor<'a> for PostExpansionVisitor<'a> {
|
|||
visit::walk_pat(self, pattern)
|
||||
}
|
||||
|
||||
fn visit_fn(&mut self,
|
||||
fn_kind: FnKind<'a>,
|
||||
fn_decl: &'a ast::FnDecl,
|
||||
span: Span,
|
||||
_node_id: NodeId) {
|
||||
fn visit_fn(&mut self, fn_kind: FnKind<'a>, fn_decl: &'a ast::FnDecl, span: Span, _: NodeId) {
|
||||
if let Some(header) = fn_kind.header() {
|
||||
// Stability of const fn methods are covered in
|
||||
// `visit_trait_item` and `visit_impl_item` below; this is
|
||||
|
@ -827,6 +814,7 @@ pub fn check_crate(krate: &ast::Crate,
|
|||
gate_all!(crate_visibility_modifier, "`crate` visibility modifier is experimental");
|
||||
gate_all!(const_generics, "const generics are unstable");
|
||||
gate_all!(decl_macro, "`macro` is experimental");
|
||||
gate_all!(box_patterns, "box pattern syntax is experimental");
|
||||
|
||||
visit::walk_crate(&mut visitor, krate);
|
||||
}
|
||||
|
|
|
@ -324,7 +324,9 @@ impl<'a> Parser<'a> {
|
|||
self.parse_pat_ident(BindingMode::ByRef(mutbl))?
|
||||
} else if self.eat_keyword(kw::Box) {
|
||||
// Parse `box pat`
|
||||
PatKind::Box(self.parse_pat_with_range_pat(false, None)?)
|
||||
let pat = self.parse_pat_with_range_pat(false, None)?;
|
||||
self.sess.gated_spans.box_patterns.borrow_mut().push(lo.to(self.prev_span));
|
||||
PatKind::Box(pat)
|
||||
} else if self.can_be_ident_pat() {
|
||||
// Parse `ident @ pat`
|
||||
// This can give false positives and parse nullary enums,
|
||||
|
|
|
@ -40,6 +40,8 @@ crate struct GatedSpans {
|
|||
pub const_generics: Lock<Vec<Span>>,
|
||||
/// Spans collected for gating `decl_macro`, e.g. `macro m() {}`.
|
||||
pub decl_macro: Lock<Vec<Span>>,
|
||||
/// Spans collected for gating `box_patterns`, e.g. `box 0`.
|
||||
pub box_patterns: Lock<Vec<Span>>,
|
||||
}
|
||||
|
||||
/// Info about a parsing session.
|
||||
|
|
|
@ -2,3 +2,6 @@ fn main() {
|
|||
let box x = Box::new('c'); //~ ERROR box pattern syntax is experimental
|
||||
println!("x: {}", x);
|
||||
}
|
||||
|
||||
macro_rules! accept_pat { ($p:pat) => {} }
|
||||
accept_pat!(box 0); //~ ERROR box pattern syntax is experimental
|
||||
|
|
|
@ -7,6 +7,15 @@ LL | let box x = Box::new('c');
|
|||
= note: for more information, see https://github.com/rust-lang/rust/issues/29641
|
||||
= help: add `#![feature(box_patterns)]` to the crate attributes to enable
|
||||
|
||||
error: aborting due to previous error
|
||||
error[E0658]: box pattern syntax is experimental
|
||||
--> $DIR/feature-gate-box_patterns.rs:7:13
|
||||
|
|
||||
LL | accept_pat!(box 0);
|
||||
| ^^^^^
|
||||
|
|
||||
= note: for more information, see https://github.com/rust-lang/rust/issues/29641
|
||||
= help: add `#![feature(box_patterns)]` to the crate attributes to enable
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0658`.
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
// check-pass
|
||||
|
||||
#![feature(or_patterns)]
|
||||
#![feature(box_patterns)]
|
||||
|
||||
fn main() {}
|
||||
|
||||
|
|
|
@ -3,6 +3,8 @@
|
|||
|
||||
// check-pass
|
||||
|
||||
#![feature(box_patterns)]
|
||||
|
||||
fn main() {}
|
||||
|
||||
macro_rules! accept_pat {
|
||||
|
|
Loading…
Add table
Reference in a new issue