use super::removed::{REMOVED_FEATURES, STABLE_REMOVED_FEATURES};
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::source_map::Spanned;
use crate::edition::{ALL_EDITIONS, Edition};
use crate::visit::{self, FnKind, Visitor};
use crate::parse::token;
}
}
}
- 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)
gate_all!(const_generics, "const generics are unstable");
gate_all!(decl_macro, "`macro` 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);
}
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 = ".." | "..." | "..=" ;`.
/// The `$path` has already been parsed and the next token is the `$form`.
fn parse_pat_range_starting_with_path(
path: Path
) -> PResult<'a, PatKind> {
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::DotDotEq => (RangeEnd::Included(RangeSyntax::DotDotEq), "..="),
_ => panic!("can only parse `..`/`...`/`..=` for ranges (checked above)"),
} else if self.eat(&token::DotDotEq) {
(RangeEnd::Included(RangeSyntax::DotDotEq), "..=")
} else if self.eat(&token::DotDot) {
- (RangeEnd::Excluded, "..")
+ (self.excluded_range_end(op_span), "..")
} else {
panic!("impossible case: we already matched on a range-operator token")
};
pub decl_macro: Lock<Vec<Span>>,
/// Spans collected for gating `box_patterns`, e.g. `box 0`.
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.
-pub fn main() {
+#[cfg(FALSE)]
+fn foo() {
match 22 {
0 .. 3 => {} //~ ERROR exclusive range pattern syntax is experimental
+ PATH .. 3 => {} //~ ERROR exclusive range pattern syntax is experimental
_ => {}
}
}
+
+fn main() {}
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 => {}
- | ^^^^^^
+ | ^^
|
= 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 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`.
match 0 {
(.. PAT) => {}
//~^ ERROR `..X` range patterns are not supported
- //~| ERROR exclusive range pattern syntax is experimental
}
}
LL | (.. 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
- --> $DIR/pat-tuple-4.rs:11:30
+ --> $DIR/pat-tuple-4.rs:10:30
|
LL | const RECOVERY_WITNESS: () = 0;
| ^ expected (), found integer
= note: expected type `()`
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 an error, try `rustc --explain E0308`.
+For more information about this error, try `rustc --explain E0308`.
| ^^^^^^ help: try using the maximum value for the type: `PAT..MAX`
error[E0658]: exclusive range pattern syntax is experimental
- --> $DIR/pat-tuple-5.rs:5:10
+ --> $DIR/pat-tuple-5.rs:5:14
|
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