d1c584e41b
In summary these are some example transitions this change makes: 'a || => ||: 'a proc:Send() => proc():Send The intended syntax for closures is to put the lifetime bound not at the front but rather in the list of bounds. Currently there is no official support in the AST for bounds that are not 'static, so this case is currently specially handled in the parser to desugar to what the AST is expecting. Additionally, this moves the bounds on procedures to the correct position, which is after the argument list. The current grammar for closures and procedures is: procedure := 'proc' [ '<' lifetime-list '>' ] '(' arg-list ')' [ ':' bound-list ] [ '->' type ] closure := [ 'unsafe' ] ['<' lifetime-list '>' ] '|' arg-list '|' [ ':' bound-list ] [ '->' type ] lifetime-list := lifetime | lifetime ',' lifetime-list arg-list := ident ':' type | ident ':' type ',' arg-list bound-list := bound | bound '+' bound-list bound := path | lifetime This does not currently handle the << ambiguity in `Option<<'a>||>`, I am deferring that to a later patch. Additionally, this removes the support for the obsolete syntaxes of ~fn and &fn. Closes #10553 Closes #10767 Closes #11209 Closes #11210 Closes #11211
32 lines
1.1 KiB
Rust
32 lines
1.1 KiB
Rust
// Copyright 2013 The Rust Project Developers. See the COPYRIGHT
|
|
// file at the top-level directory of this distribution and at
|
|
// http://rust-lang.org/COPYRIGHT.
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
|
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
|
// option. This file may not be copied, modified, or distributed
|
|
// except according to those terms.
|
|
|
|
/*!
|
|
* Try to double-check that static fns have the right size (with or
|
|
* without dummy env ptr, as appropriate) by iterating a size-2 array.
|
|
* If the static size differs from the runtime size, the second element
|
|
* should be read as a null or otherwise wrong pointer and crash.
|
|
*/
|
|
|
|
fn f() { }
|
|
static bare_fns: &'static [fn()] = &[f, f];
|
|
struct S<'a>(||:'a);
|
|
static mut closures: &'static [S<'static>] = &[S(f), S(f)];
|
|
|
|
pub fn main() {
|
|
unsafe {
|
|
for &bare_fn in bare_fns.iter() { bare_fn() }
|
|
for closure in closures.iter() {
|
|
let S(ref closure) = *closure;
|
|
(*closure)()
|
|
}
|
|
}
|
|
}
|