Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature gate *all* slice patterns. #23121 #23794

Merged
merged 1 commit into from
Mar 28, 2015
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 7 additions & 3 deletions src/doc/reference.md
Original file line number Diff line number Diff line change
Expand Up @@ -2408,9 +2408,13 @@ considered off, and using the features will result in a compiler error.

The currently implemented features of the reference compiler are:

* `advanced_slice_patterns` - see the [match expressions](#match-expressions)
* `advanced_slice_patterns` - See the [match expressions](#match-expressions)
section for discussion; the exact semantics of
slice patterns are subject to change.
slice patterns are subject to change, so some types
are still unstable.

* `slice_patterns` - OK, actually, slice patterns are just scary and
completely unstable.

* `asm` - The `asm!` macro provides a means for inline assembly. This is often
useful, but the exact syntax for this feature along with its
Expand Down Expand Up @@ -3329,7 +3333,7 @@ array, like `[.., 42, ..]`. If preceded by a variable name, it will bind the
corresponding slice to the variable. Example:

```
# #![feature(advanced_slice_patterns)]
# #![feature(advanced_slice_patterns, slice_patterns)]
fn is_symmetric(list: &[u32]) -> bool {
match list {
[] | [_] => true,
Expand Down
1 change: 1 addition & 0 deletions src/doc/trpl/patterns.md
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,7 @@ match origin {
If you want to match against a slice or array, you can use `&`:

```{rust}
# #![feature(slice_patterns)]
fn main() {
let v = vec!["match_this", "1"];

Expand Down
1 change: 1 addition & 0 deletions src/libcollections/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@
#![feature(step_by)]
#![feature(str_char)]
#![feature(convert)]
#![feature(slice_patterns)]
#![cfg_attr(test, feature(rand, rustc_private, test, hash, collections))]
#![cfg_attr(test, allow(deprecated))] // rand

Expand Down
1 change: 1 addition & 0 deletions src/libcoretest/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
#![feature(debug_builders)]
#![feature(unique)]
#![feature(step_by)]
#![feature(slice_patterns)]
#![allow(deprecated)] // rand

extern crate core;
Expand Down
1 change: 1 addition & 0 deletions src/librustc/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@
#![feature(str_char)]
#![feature(convert)]
#![feature(into_cow)]
#![feature(slice_patterns)]
#![cfg_attr(test, feature(test))]

#![allow(trivial_casts)]
Expand Down
1 change: 1 addition & 0 deletions src/librustdoc/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@
#![feature(path_ext)]
#![feature(path_relative_from)]
#![feature(convert)]
#![feature(slice_patterns)]

extern crate arena;
extern crate getopts;
Expand Down
1 change: 1 addition & 0 deletions src/libstd/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,7 @@
#![feature(allow_internal_unstable)]
#![feature(str_char)]
#![feature(into_cow)]
#![feature(slice_patterns)]
#![cfg_attr(test, feature(test, rustc_private, std_misc))]

// Don't link to std. We are std.
Expand Down
8 changes: 8 additions & 0 deletions src/libsyntax/feature_gate.rs
Original file line number Diff line number Diff line change
Expand Up @@ -153,6 +153,9 @@ const KNOWN_FEATURES: &'static [(&'static str, &'static str, Status)] = &[
// below (it has to be checked before expansion possibly makes
// macros disappear).
("allow_internal_unstable", "1.0.0", Active),

// #23121. Array patterns have some hazards yet.
("slice_patterns", "1.0.0", Active),
];
// (changing above list without updating src/doc/reference.md makes @cmr sad)

Expand Down Expand Up @@ -694,6 +697,11 @@ impl<'a, 'v> Visitor<'v> for PostExpansionVisitor<'a> {
but at the end of a slice (e.g. \
`[0, ..xs, 0]` are experimental")
}
ast::PatVec(..) => {
self.gate_feature("slice_patterns",
pattern.span,
"slice pattern syntax is experimental");
}
ast::PatBox(..) => {
self.gate_feature("box_patterns",
pattern.span,
Expand Down
1 change: 1 addition & 0 deletions src/libsyntax/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@
#![feature(str_char)]
#![feature(convert)]
#![feature(into_cow)]
#![feature(slice_patterns)]

extern crate arena;
extern crate fmt_macros;
Expand Down
1 change: 1 addition & 0 deletions src/test/auxiliary/roman_numerals.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@

#![crate_type="dylib"]
#![feature(plugin_registrar, rustc_private)]
#![feature(slice_patterns)]

extern crate syntax;
extern crate rustc;
Expand Down
2 changes: 2 additions & 0 deletions src/test/compile-fail/borrowck-match-binding-is-assignment.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@

// Test that immutable pattern bindings cannot be reassigned.

#![feature(slice_patterns)]

enum E {
Foo(isize)
}
Expand Down
2 changes: 2 additions & 0 deletions src/test/compile-fail/borrowck-move-out-of-vec-tail.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@

// Test that we do not permit moves from &[] matched by a vec pattern.

#![feature(slice_patterns)]

#[derive(Clone, Debug)]
struct Foo {
string: String
Expand Down
1 change: 1 addition & 0 deletions src/test/compile-fail/borrowck-vec-pattern-element-loan.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
// except according to those terms.

#![feature(advanced_slice_patterns)]
#![feature(slice_patterns)]

fn a<'a>() -> &'a [isize] {
let vec = vec!(1, 2, 3, 4);
Expand Down
2 changes: 2 additions & 0 deletions src/test/compile-fail/borrowck-vec-pattern-loan-from-mut.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.

#![feature(slice_patterns)]

fn a() {
let mut v = vec!(1, 2, 3);
let vb: &mut [isize] = &mut v;
Expand Down
2 changes: 2 additions & 0 deletions src/test/compile-fail/borrowck-vec-pattern-move-tail.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.

#![feature(slice_patterns)]

fn main() {
let mut a = [1, 2, 3, 4];
let t = match a {
Expand Down
1 change: 1 addition & 0 deletions src/test/compile-fail/borrowck-vec-pattern-nesting.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
#![feature(advanced_slice_patterns)]
#![feature(box_patterns)]
#![feature(box_syntax)]
#![feature(slice_patterns)]

fn a() {
let mut vec = [box 1, box 2, box 3];
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.

#![feature(slice_patterns)]

fn a<'a>() -> &'a isize {
let vec = vec!(1, 2, 3, 4);
let vec: &[isize] = &vec; //~ ERROR `vec` does not live long enough
Expand Down
2 changes: 2 additions & 0 deletions src/test/compile-fail/feature-gate-advanced-slice-features.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.

#![feature(slice_patterns)]

fn main() {
let x = [ 1, 2, 3, 4, 5 ];
match x {
Expand Down
2 changes: 2 additions & 0 deletions src/test/compile-fail/issue-12369.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.

#![feature(slice_patterns)]

fn main() {
let sl = vec![1,2,3];
let v: isize = match &*sl {
Expand Down
2 changes: 2 additions & 0 deletions src/test/compile-fail/issue-12567.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.

#![feature(slice_patterns)]

fn match_vecs<'a, T>(l1: &'a [T], l2: &'a [T]) {
match (l1, l2) {
([], []) => println!("both empty"),
Expand Down
2 changes: 2 additions & 0 deletions src/test/compile-fail/issue-13482-2.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@

// compile-flags:-Z verbose

#![feature(slice_patterns)]

fn main() {
let x = [1,2];
let y = match x {
Expand Down
2 changes: 2 additions & 0 deletions src/test/compile-fail/issue-13482.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.

#![feature(slice_patterns)]

fn main() {
let x = [1,2];
let y = match x {
Expand Down
2 changes: 2 additions & 0 deletions src/test/compile-fail/issue-15381.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.

#![feature(slice_patterns)]

fn main() {
let values: Vec<u8> = vec![1,2,3,4,5,6,7,8];

Expand Down
1 change: 1 addition & 0 deletions src/test/compile-fail/issue-6804.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
// except according to those terms.

#![feature(rustc_attrs)]
#![feature(slice_patterns)]
#![allow(dead_code)]

// Matching against NaN should result in a warning
Expand Down
2 changes: 2 additions & 0 deletions src/test/compile-fail/match-ref-ice.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.

#![feature(slice_patterns)]

// The arity of `ref x` is always 1. If the pattern is compared to some non-structural type whose
// arity is always 0, an ICE occurs.
//
Expand Down
2 changes: 2 additions & 0 deletions src/test/compile-fail/match-vec-fixed.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.

#![feature(slice_patterns)]

fn a() {
let v = [1, 2, 3];
match v {
Expand Down
2 changes: 2 additions & 0 deletions src/test/compile-fail/match-vec-mismatch-2.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.

#![feature(slice_patterns)]

fn main() {
match () {
[()] => { }
Expand Down
2 changes: 2 additions & 0 deletions src/test/compile-fail/match-vec-mismatch.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.

#![feature(slice_patterns)]

fn main() {
match "foo".to_string() {
['f', 'o', ..] => {} //~ ERROR mismatched types
Expand Down
1 change: 1 addition & 0 deletions src/test/compile-fail/match-vec-unreachable.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.

#![feature(slice_patterns)]

fn main() {
let x: Vec<(isize, isize)> = Vec::new();
Expand Down
2 changes: 2 additions & 0 deletions src/test/compile-fail/non-exhaustive-match-nested.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.

#![feature(slice_patterns)]

enum t { a(u), b }
enum u { c, d }

Expand Down
2 changes: 2 additions & 0 deletions src/test/compile-fail/non-exhaustive-match.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.

#![feature(slice_patterns)]

enum t { a, b, }

fn main() {
Expand Down
1 change: 1 addition & 0 deletions src/test/compile-fail/non-exhaustive-pattern-witness.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
// except according to those terms.

#![feature(advanced_slice_patterns)]
#![feature(slice_patterns)]

struct Foo {
first: bool,
Expand Down
2 changes: 2 additions & 0 deletions src/test/compile-fail/regions-pattern-typing-issue-19552.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.

#![feature(slice_patterns)]

fn assert_static<T: 'static>(_t: T) {}

fn main() {
Expand Down
2 changes: 2 additions & 0 deletions src/test/run-make/graphviz-flowgraph/f07.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.

#![feature(slice_patterns)]

pub fn pat_vec_7() {
match [7, 77, 777, 7777] {
[x, y, ..] => x + y
Expand Down
2 changes: 2 additions & 0 deletions src/test/run-pass/destructure-array-1.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@

// pretty-expanded FIXME #23616

#![feature(slice_patterns)]

struct D { x: u8 }

impl Drop for D { fn drop(&mut self) { } }
Expand Down
1 change: 1 addition & 0 deletions src/test/run-pass/ignore-all-the-things.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
// pretty-expanded FIXME #23616

#![feature(advanced_slice_patterns)]
#![feature(slice_patterns)]

struct Foo(int, int, int, int);
struct Bar{a: int, b: int, c: int, d: int}
Expand Down
2 changes: 2 additions & 0 deletions src/test/run-pass/issue-13027.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@
// Tests that match expression handles overlapped literal and range
// properly in the presence of guard function.

#![feature(slice_patterns)]

fn val() -> uint { 1 }

static CONST: uint = 1;
Expand Down
2 changes: 2 additions & 0 deletions src/test/run-pass/issue-15080.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@

// pretty-expanded FIXME #23616

#![feature(slice_patterns)]

fn main() {
let mut x: &[_] = &[1, 2, 3, 4];

Expand Down
2 changes: 2 additions & 0 deletions src/test/run-pass/issue-15104.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@

// pretty-expanded FIXME #23616

#![feature(slice_patterns)]

fn main() {
assert_eq!(count_members(&[1, 2, 3, 4]), 4);
}
Expand Down
2 changes: 2 additions & 0 deletions src/test/run-pass/issue-16648.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@

// pretty-expanded FIXME #23616

#![feature(slice_patterns)]

fn main() {
let x: (int, &[int]) = (2, &[1, 2]);
assert_eq!(match x {
Expand Down
2 changes: 2 additions & 0 deletions src/test/run-pass/issue-17877.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@

// pretty-expanded FIXME #23616

#![feature(slice_patterns)]

fn main() {
assert_eq!(match [0u8; 1024] {
_ => 42_usize,
Expand Down
1 change: 1 addition & 0 deletions src/test/run-pass/issue-7784.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
// pretty-expanded FIXME #23616

#![feature(advanced_slice_patterns)]
#![feature(slice_patterns)]

use std::ops::Add;

Expand Down
1 change: 1 addition & 0 deletions src/test/run-pass/match-vec-alternatives.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
// pretty-expanded FIXME #23616

#![feature(advanced_slice_patterns)]
#![feature(slice_patterns)]

fn match_vecs<'a, T>(l1: &'a [T], l2: &'a [T]) -> &'static str {
match (l1, l2) {
Expand Down
Loading