Place parenthetical notation under the unboxed_closure feature-gate.

Consolidate the `unboxed_closure_sugar` and `unboxed_closure` feature gates.
This commit is contained in:
Niko Matsakis 2014-11-15 16:04:04 -05:00
parent 618bd5d1c5
commit 058abcc209
25 changed files with 39 additions and 21 deletions

View File

@ -2560,10 +2560,6 @@ The currently implemented features of the reference compiler are:
* `trace_macros` - Allows use of the `trace_macros` macro, which is a nasty * `trace_macros` - Allows use of the `trace_macros` macro, which is a nasty
hack that will certainly be removed. hack that will certainly be removed.
* `unboxed_closure_sugar` - Allows using `|Foo| -> Bar` as a trait bound
meaning one of the `Fn` traits. Still
experimental.
* `unboxed_closures` - A work in progress feature with many known bugs. * `unboxed_closures` - A work in progress feature with many known bugs.
* `unsafe_destructor` - Allows use of the `#[unsafe_destructor]` attribute, * `unsafe_destructor` - Allows use of the `#[unsafe_destructor]` attribute,

View File

@ -59,7 +59,6 @@ static KNOWN_FEATURES: &'static [(&'static str, Status)] = &[
("linkage", Active), ("linkage", Active),
("struct_inherit", Removed), ("struct_inherit", Removed),
("overloaded_calls", Active), ("overloaded_calls", Active),
("unboxed_closure_sugar", Active),
("quad_precision_float", Removed), ("quad_precision_float", Removed),
@ -381,7 +380,7 @@ impl<'a, 'v> Visitor<'v> for Context<'a> {
fn_decl: &'v ast::FnDecl, fn_decl: &'v ast::FnDecl,
block: &'v ast::Block, block: &'v ast::Block,
span: Span, span: Span,
_: NodeId) { _node_id: NodeId) {
match fn_kind { match fn_kind {
visit::FkItemFn(_, _, _, abi) if abi == RustIntrinsic => { visit::FkItemFn(_, _, _, abi) if abi == RustIntrinsic => {
self.gate_feature("intrinsics", self.gate_feature("intrinsics",
@ -392,6 +391,19 @@ impl<'a, 'v> Visitor<'v> for Context<'a> {
} }
visit::walk_fn(self, fn_kind, fn_decl, block, span); visit::walk_fn(self, fn_kind, fn_decl, block, span);
} }
fn visit_path_parameters(&mut self, path_span: Span, parameters: &'v ast::PathParameters) {
match *parameters {
ast::ParenthesizedParameters(..) => {
self.gate_feature("unboxed_closures",
path_span,
"parenthetical parameter notation is subject to change");
}
ast::AngleBracketedParameters(..) => { }
}
visit::walk_path_parameters(self, path_span, parameters)
}
} }
pub fn check_crate(span_handler: &SpanHandler, krate: &ast::Crate) -> (Features, Vec<Span>) { pub fn check_crate(span_handler: &SpanHandler, krate: &ast::Crate) -> (Features, Vec<Span>) {

View File

@ -8,7 +8,7 @@
// option. This file may not be copied, modified, or distributed // option. This file may not be copied, modified, or distributed
// except according to those terms. // except according to those terms.
#![feature(overloaded_calls)] #![feature(overloaded_calls, unboxed_closures)]
fn a<F:Fn(int, int) -> int>(mut f: F) { fn a<F:Fn(int, int) -> int>(mut f: F) {
let g = &mut f; let g = &mut f;

View File

@ -8,7 +8,7 @@
// option. This file may not be copied, modified, or distributed // option. This file may not be copied, modified, or distributed
// except according to those terms. // except according to those terms.
#![feature(overloaded_calls)] #![feature(overloaded_calls, unboxed_closures)]
// Make sure we don't ICE when making an overloaded call with the // Make sure we don't ICE when making an overloaded call with the
// wrong arity. // wrong arity.

View File

@ -8,7 +8,7 @@
// option. This file may not be copied, modified, or distributed // option. This file may not be copied, modified, or distributed
// except according to those terms. // except according to those terms.
#![feature(unboxed_closure_sugar, unboxed_closures, overloaded_calls)] #![feature(unboxed_closures, overloaded_calls)]
use std::ops::FnMut; use std::ops::FnMut;

View File

@ -11,7 +11,7 @@
// Test interaction between unboxed closure sugar and default type // Test interaction between unboxed closure sugar and default type
// parameters (should be exactly as if angle brackets were used). // parameters (should be exactly as if angle brackets were used).
#![feature(default_type_params)] #![feature(default_type_params, unboxed_closures)]
#![allow(dead_code)] #![allow(dead_code)]
struct Foo<T,U,V=T> { struct Foo<T,U,V=T> {

View File

@ -13,6 +13,7 @@
// angle brackets. This test covers only simple types and in // angle brackets. This test covers only simple types and in
// particular doesn't test bound regions. // particular doesn't test bound regions.
#![feature(unboxed_closures)]
#![allow(dead_code)] #![allow(dead_code)]
struct Foo<T,U> { struct Foo<T,U> {

View File

@ -8,6 +8,8 @@
// option. This file may not be copied, modified, or distributed // option. This file may not be copied, modified, or distributed
// except according to those terms. // except according to those terms.
#![feature(unboxed_closures)]
fn f<F:Nonexist(int) -> int>(x: F) {} //~ ERROR nonexistent trait `Nonexist` fn f<F:Nonexist(int) -> int>(x: F) {} //~ ERROR nonexistent trait `Nonexist`
type Typedef = int; type Typedef = int;

View File

@ -12,7 +12,7 @@
// parameters (should be exactly as if angle brackets were used // parameters (should be exactly as if angle brackets were used
// and regions omitted). // and regions omitted).
#![feature(default_type_params)] #![feature(default_type_params, unboxed_closures)]
#![allow(dead_code)] #![allow(dead_code)]
use std::kinds::marker; use std::kinds::marker;

View File

@ -9,6 +9,7 @@
// except according to those terms. // except according to those terms.
struct One<A>; struct One<A>;
#![feature(unboxed_closures)]
fn foo(_: One()) //~ ERROR wrong number of type arguments fn foo(_: One()) //~ ERROR wrong number of type arguments
{} {}

View File

@ -9,6 +9,7 @@
// except according to those terms. // except according to those terms.
struct Three<A,B,C>; struct Three<A,B,C>;
#![feature(unboxed_closures)]
fn foo(_: Three()) //~ ERROR wrong number of type arguments fn foo(_: Three()) //~ ERROR wrong number of type arguments
{} {}

View File

@ -9,6 +9,7 @@
// except according to those terms. // except according to those terms.
struct Zero; struct Zero;
#![feature(unboxed_closures)]
fn foo(_: Zero()) //~ ERROR wrong number of type arguments fn foo(_: Zero()) //~ ERROR wrong number of type arguments
{} {}

View File

@ -8,6 +8,8 @@
// option. This file may not be copied, modified, or distributed // option. This file may not be copied, modified, or distributed
// except according to those terms. // except according to those terms.
#![feature(unboxed_closures)]
trait Trait {} trait Trait {}
fn f<F:Trait(int) -> int>(x: F) {} fn f<F:Trait(int) -> int>(x: F) {}

View File

@ -11,7 +11,7 @@
// Checks that the Fn trait hierarchy rules do not permit // Checks that the Fn trait hierarchy rules do not permit
// Fn to be used where FnMut is implemented. // Fn to be used where FnMut is implemented.
#![feature(unboxed_closure_sugar)] #![feature(unboxed_closures)]
#![feature(overloaded_calls)] #![feature(overloaded_calls)]
use std::ops::{Fn,FnMut,FnOnce}; use std::ops::{Fn,FnMut,FnOnce};

View File

@ -9,7 +9,7 @@
// except according to those terms. // except according to those terms.
#![allow(dead_code)] #![allow(dead_code)]
#![feature(unboxed_closures, unboxed_closure_sugar)] #![feature(unboxed_closures)]
// compile-flags:-g // compile-flags:-g

View File

@ -11,6 +11,7 @@
// Test that we can parse all the various places that a `for` keyword // Test that we can parse all the various places that a `for` keyword
// can appear representing universal quantification. // can appear representing universal quantification.
#![feature(unboxed_closures)]
#![allow(unused_variables)] #![allow(unused_variables)]
#![allow(dead_code)] #![allow(dead_code)]

View File

@ -11,7 +11,7 @@
// Test that param substitutions from the correct environment are // Test that param substitutions from the correct environment are
// used when translating unboxed closure calls. // used when translating unboxed closure calls.
#![feature(unboxed_closures)] #![feature(unboxed_closures, unboxed_closures)]
pub fn inside<F: Fn()>(c: F) { pub fn inside<F: Fn()>(c: F) {
c.call(()); c.call(());

View File

@ -8,7 +8,7 @@
// option. This file may not be copied, modified, or distributed // option. This file may not be copied, modified, or distributed
// except according to those terms. // except according to those terms.
#![feature(lang_items, overloaded_calls, unboxed_closures)] #![feature(lang_items, overloaded_calls, unboxed_closures, unboxed_closures)]
fn a<F:Fn(int, int) -> int>(f: F) -> int { fn a<F:Fn(int, int) -> int>(f: F) -> int {
f(1, 2) f(1, 2)

View File

@ -10,7 +10,7 @@
// Checks that extern fn points implement the full range of Fn traits. // Checks that extern fn points implement the full range of Fn traits.
#![feature(unboxed_closure_sugar)] #![feature(unboxed_closures)]
#![feature(overloaded_calls)] #![feature(overloaded_calls)]
use std::ops::{Fn,FnMut,FnOnce}; use std::ops::{Fn,FnMut,FnOnce};

View File

@ -11,7 +11,7 @@
// Checks that the Fn trait hierarchy rules permit // Checks that the Fn trait hierarchy rules permit
// any Fn trait to be used where Fn is implemented. // any Fn trait to be used where Fn is implemented.
#![feature(unboxed_closure_sugar)] #![feature(unboxed_closures)]
#![feature(overloaded_calls)] #![feature(overloaded_calls)]
use std::ops::{Fn,FnMut,FnOnce}; use std::ops::{Fn,FnMut,FnOnce};

View File

@ -11,7 +11,7 @@
// Checks that the Fn trait hierarchy rules permit // Checks that the Fn trait hierarchy rules permit
// FnMut or FnOnce to be used where FnMut is implemented. // FnMut or FnOnce to be used where FnMut is implemented.
#![feature(unboxed_closure_sugar)] #![feature(unboxed_closures)]
#![feature(overloaded_calls)] #![feature(overloaded_calls)]
use std::ops::{FnMut,FnOnce}; use std::ops::{FnMut,FnOnce};

View File

@ -9,7 +9,7 @@
// option. This file may not be copied, modified, or distributed // option. This file may not be copied, modified, or distributed
// except according to those terms. // except according to those terms.
#![feature(unboxed_closure_sugar)] #![feature(unboxed_closures)]
use std::ops::FnMut; use std::ops::FnMut;

View File

@ -10,7 +10,7 @@
// Tests that the reexports of `FnOnce` et al from the prelude work. // Tests that the reexports of `FnOnce` et al from the prelude work.
#![feature(unboxed_closures, unboxed_closure_sugar)] #![feature(unboxed_closures)]
fn main() { fn main() {
let task: Box<FnOnce(int) -> int> = box |: x| x; let task: Box<FnOnce(int) -> int> = box |: x| x;

View File

@ -11,6 +11,7 @@
// Test unboxed closure sugar used in object types. // Test unboxed closure sugar used in object types.
#![allow(dead_code)] #![allow(dead_code)]
#![feature(unboxed_closures)]
struct Foo<T,U> { struct Foo<T,U> {
t: T, u: U t: T, u: U

View File

@ -8,7 +8,7 @@
// option. This file may not be copied, modified, or distributed // option. This file may not be copied, modified, or distributed
// except according to those terms. // except according to those terms.
#![feature(unboxed_closures, unboxed_closure_sugar)] #![feature(unboxed_closures)]
use std::ops::FnOnce; use std::ops::FnOnce;