pre-expansion gate exclusive_range_pattern
This commit is contained in:
@@ -3,9 +3,8 @@ use super::accepted::ACCEPTED_FEATURES;
|
|||||||
use super::removed::{REMOVED_FEATURES, STABLE_REMOVED_FEATURES};
|
use super::removed::{REMOVED_FEATURES, STABLE_REMOVED_FEATURES};
|
||||||
use super::builtin_attrs::{AttributeGate, BUILTIN_ATTRIBUTE_MAP};
|
use super::builtin_attrs::{AttributeGate, BUILTIN_ATTRIBUTE_MAP};
|
||||||
|
|
||||||
use crate::ast::{self, NodeId, PatKind, RangeEnd, VariantData};
|
use crate::ast::{self, NodeId, PatKind, VariantData};
|
||||||
use crate::attr::{self, check_builtin_attribute};
|
use crate::attr::{self, check_builtin_attribute};
|
||||||
use crate::source_map::Spanned;
|
|
||||||
use crate::edition::{ALL_EDITIONS, Edition};
|
use crate::edition::{ALL_EDITIONS, Edition};
|
||||||
use crate::visit::{self, FnKind, Visitor};
|
use crate::visit::{self, FnKind, Visitor};
|
||||||
use crate::parse::token;
|
use crate::parse::token;
|
||||||
@@ -529,10 +528,6 @@ impl<'a> Visitor<'a> for PostExpansionVisitor<'a> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
PatKind::Range(_, _, Spanned { node: RangeEnd::Excluded, .. }) => {
|
|
||||||
gate_feature_post!(&self, exclusive_range_pattern, pattern.span,
|
|
||||||
"exclusive range pattern syntax is experimental");
|
|
||||||
}
|
|
||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
visit::walk_pat(self, pattern)
|
visit::walk_pat(self, pattern)
|
||||||
@@ -815,6 +810,7 @@ pub fn check_crate(krate: &ast::Crate,
|
|||||||
gate_all!(const_generics, "const generics are unstable");
|
gate_all!(const_generics, "const generics are unstable");
|
||||||
gate_all!(decl_macro, "`macro` is experimental");
|
gate_all!(decl_macro, "`macro` is experimental");
|
||||||
gate_all!(box_patterns, "box pattern syntax is experimental");
|
gate_all!(box_patterns, "box pattern syntax is experimental");
|
||||||
|
gate_all!(exclusive_range_pattern, "exclusive range pattern syntax is experimental");
|
||||||
|
|
||||||
visit::walk_crate(&mut visitor, krate);
|
visit::walk_crate(&mut visitor, krate);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -611,6 +611,11 @@ impl<'a> Parser<'a> {
|
|||||||
Ok(PatKind::Mac(mac))
|
Ok(PatKind::Mac(mac))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn excluded_range_end(&self, span: Span) -> RangeEnd {
|
||||||
|
self.sess.gated_spans.exclusive_range_pattern.borrow_mut().push(span);
|
||||||
|
RangeEnd::Excluded
|
||||||
|
}
|
||||||
|
|
||||||
/// Parse a range pattern `$path $form $end?` where `$form = ".." | "..." | "..=" ;`.
|
/// Parse a range pattern `$path $form $end?` where `$form = ".." | "..." | "..=" ;`.
|
||||||
/// The `$path` has already been parsed and the next token is the `$form`.
|
/// The `$path` has already been parsed and the next token is the `$form`.
|
||||||
fn parse_pat_range_starting_with_path(
|
fn parse_pat_range_starting_with_path(
|
||||||
@@ -620,7 +625,7 @@ impl<'a> Parser<'a> {
|
|||||||
path: Path
|
path: Path
|
||||||
) -> PResult<'a, PatKind> {
|
) -> PResult<'a, PatKind> {
|
||||||
let (end_kind, form) = match self.token.kind {
|
let (end_kind, form) = match self.token.kind {
|
||||||
token::DotDot => (RangeEnd::Excluded, ".."),
|
token::DotDot => (self.excluded_range_end(self.token.span), ".."),
|
||||||
token::DotDotDot => (RangeEnd::Included(RangeSyntax::DotDotDot), "..."),
|
token::DotDotDot => (RangeEnd::Included(RangeSyntax::DotDotDot), "..."),
|
||||||
token::DotDotEq => (RangeEnd::Included(RangeSyntax::DotDotEq), "..="),
|
token::DotDotEq => (RangeEnd::Included(RangeSyntax::DotDotEq), "..="),
|
||||||
_ => panic!("can only parse `..`/`...`/`..=` for ranges (checked above)"),
|
_ => panic!("can only parse `..`/`...`/`..=` for ranges (checked above)"),
|
||||||
@@ -643,7 +648,7 @@ impl<'a> Parser<'a> {
|
|||||||
} else if self.eat(&token::DotDotEq) {
|
} else if self.eat(&token::DotDotEq) {
|
||||||
(RangeEnd::Included(RangeSyntax::DotDotEq), "..=")
|
(RangeEnd::Included(RangeSyntax::DotDotEq), "..=")
|
||||||
} else if self.eat(&token::DotDot) {
|
} else if self.eat(&token::DotDot) {
|
||||||
(RangeEnd::Excluded, "..")
|
(self.excluded_range_end(op_span), "..")
|
||||||
} else {
|
} else {
|
||||||
panic!("impossible case: we already matched on a range-operator token")
|
panic!("impossible case: we already matched on a range-operator token")
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -42,6 +42,8 @@ crate struct GatedSpans {
|
|||||||
pub decl_macro: Lock<Vec<Span>>,
|
pub decl_macro: Lock<Vec<Span>>,
|
||||||
/// Spans collected for gating `box_patterns`, e.g. `box 0`.
|
/// Spans collected for gating `box_patterns`, e.g. `box 0`.
|
||||||
pub box_patterns: Lock<Vec<Span>>,
|
pub box_patterns: Lock<Vec<Span>>,
|
||||||
|
/// Spans collected for gating `exclusive_range_pattern`, e.g. `0..2`.
|
||||||
|
pub exclusive_range_pattern: Lock<Vec<Span>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Info about a parsing session.
|
/// Info about a parsing session.
|
||||||
|
|||||||
@@ -1,6 +1,10 @@
|
|||||||
pub fn main() {
|
#[cfg(FALSE)]
|
||||||
|
fn foo() {
|
||||||
match 22 {
|
match 22 {
|
||||||
0 .. 3 => {} //~ ERROR exclusive range pattern syntax is experimental
|
0 .. 3 => {} //~ ERROR exclusive range pattern syntax is experimental
|
||||||
|
PATH .. 3 => {} //~ ERROR exclusive range pattern syntax is experimental
|
||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
||||||
|
|||||||
@@ -1,12 +1,21 @@
|
|||||||
error[E0658]: exclusive range pattern syntax is experimental
|
error[E0658]: exclusive range pattern syntax is experimental
|
||||||
--> $DIR/feature-gate-exclusive-range-pattern.rs:3:9
|
--> $DIR/feature-gate-exclusive-range-pattern.rs:4:11
|
||||||
|
|
|
|
||||||
LL | 0 .. 3 => {}
|
LL | 0 .. 3 => {}
|
||||||
| ^^^^^^
|
| ^^
|
||||||
|
|
|
|
||||||
= note: for more information, see https://github.com/rust-lang/rust/issues/37854
|
= note: for more information, see https://github.com/rust-lang/rust/issues/37854
|
||||||
= help: add `#![feature(exclusive_range_pattern)]` to the crate attributes to enable
|
= help: add `#![feature(exclusive_range_pattern)]` to the crate attributes to enable
|
||||||
|
|
||||||
error: aborting due to previous error
|
error[E0658]: exclusive range pattern syntax is experimental
|
||||||
|
--> $DIR/feature-gate-exclusive-range-pattern.rs:5:14
|
||||||
|
|
|
||||||
|
LL | PATH .. 3 => {}
|
||||||
|
| ^^
|
||||||
|
|
|
||||||
|
= note: for more information, see https://github.com/rust-lang/rust/issues/37854
|
||||||
|
= help: add `#![feature(exclusive_range_pattern)]` to the crate attributes to enable
|
||||||
|
|
||||||
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0658`.
|
For more information about this error, try `rustc --explain E0658`.
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ fn main() {
|
|||||||
match 0 {
|
match 0 {
|
||||||
(.. PAT) => {}
|
(.. PAT) => {}
|
||||||
//~^ ERROR `..X` range patterns are not supported
|
//~^ ERROR `..X` range patterns are not supported
|
||||||
//~| ERROR exclusive range pattern syntax is experimental
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4,17 +4,8 @@ error: `..X` range patterns are not supported
|
|||||||
LL | (.. PAT) => {}
|
LL | (.. PAT) => {}
|
||||||
| ^^^^^^ help: try using the minimum value for the type: `MIN..PAT`
|
| ^^^^^^ help: try using the minimum value for the type: `MIN..PAT`
|
||||||
|
|
||||||
error[E0658]: exclusive range pattern syntax is experimental
|
|
||||||
--> $DIR/pat-tuple-4.rs:5:10
|
|
||||||
|
|
|
||||||
LL | (.. PAT) => {}
|
|
||||||
| ^^^^^^
|
|
||||||
|
|
|
||||||
= note: for more information, see https://github.com/rust-lang/rust/issues/37854
|
|
||||||
= help: add `#![feature(exclusive_range_pattern)]` to the crate attributes to enable
|
|
||||||
|
|
||||||
error[E0308]: mismatched types
|
error[E0308]: mismatched types
|
||||||
--> $DIR/pat-tuple-4.rs:11:30
|
--> $DIR/pat-tuple-4.rs:10:30
|
||||||
|
|
|
|
||||||
LL | const RECOVERY_WITNESS: () = 0;
|
LL | const RECOVERY_WITNESS: () = 0;
|
||||||
| ^ expected (), found integer
|
| ^ expected (), found integer
|
||||||
@@ -22,7 +13,6 @@ LL | const RECOVERY_WITNESS: () = 0;
|
|||||||
= note: expected type `()`
|
= note: expected type `()`
|
||||||
found type `{integer}`
|
found type `{integer}`
|
||||||
|
|
||||||
error: aborting due to 3 previous errors
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
Some errors have detailed explanations: E0308, E0658.
|
For more information about this error, try `rustc --explain E0308`.
|
||||||
For more information about an error, try `rustc --explain E0308`.
|
|
||||||
|
|||||||
@@ -5,10 +5,10 @@ LL | (PAT ..) => {}
|
|||||||
| ^^^^^^ help: try using the maximum value for the type: `PAT..MAX`
|
| ^^^^^^ help: try using the maximum value for the type: `PAT..MAX`
|
||||||
|
|
||||||
error[E0658]: exclusive range pattern syntax is experimental
|
error[E0658]: exclusive range pattern syntax is experimental
|
||||||
--> $DIR/pat-tuple-5.rs:5:10
|
--> $DIR/pat-tuple-5.rs:5:14
|
||||||
|
|
|
|
||||||
LL | (PAT ..) => {}
|
LL | (PAT ..) => {}
|
||||||
| ^^^^^^
|
| ^^
|
||||||
|
|
|
|
||||||
= note: for more information, see https://github.com/rust-lang/rust/issues/37854
|
= note: for more information, see https://github.com/rust-lang/rust/issues/37854
|
||||||
= help: add `#![feature(exclusive_range_pattern)]` to the crate attributes to enable
|
= help: add `#![feature(exclusive_range_pattern)]` to the crate attributes to enable
|
||||||
|
|||||||
Reference in New Issue
Block a user