test: Fix rustdoc and tests.

This commit is contained in:
Patrick Walton 2013-09-16 23:37:54 -07:00
parent a170183ba3
commit 90d3da9711
102 changed files with 196 additions and 943 deletions

View File

@ -1469,34 +1469,6 @@ cannot be stored in data structures or returned from
functions. Despite these limitations, stack closures are used
pervasively in Rust code.
## Managed closures
When you need to store a closure in a data structure, a stack closure
will not do, since the compiler will refuse to let you store it. For
this purpose, Rust provides a type of closure that has an arbitrary
lifetime, written `@fn` (boxed closure, analogous to the `@` pointer
type described earlier). This type of closure *is* first-class.
A managed closure does not directly access its environment, but merely
copies out the values that it closes over into a private data
structure. This means that it can not assign to these variables, and
cannot observe updates to them.
This code creates a closure that adds a given string to its argument,
returns it from a function, and then calls it:
~~~~
fn mk_appender(suffix: ~str) -> @fn(~str) -> ~str {
// The compiler knows that we intend this closure to be of type @fn
return |s| s + suffix;
}
fn main() {
let shout = mk_appender(~"!");
println(shout(~"hey ho, let's go"));
}
~~~~
## Owned closures
Owned closures, written `~fn` in analogy to the `~` pointer type,

View File

@ -162,8 +162,11 @@ mod tests {
}
impl Runnable for LibcFree {
#[fixed_stack_segment]
fn run(~self) {
libc::free(self.mem)
unsafe {
libc::free(self.mem)
}
}
}

View File

@ -1065,8 +1065,12 @@ mod test {
Err(f) => fail!("test_switch_implies_cfg_test: %s", f.to_err_msg())
};
let sessopts = build_session_options(
@"rustc", matches, diagnostic::emit);
let sess = build_session(sessopts, diagnostic::emit);
@"rustc",
matches,
@diagnostic::DefaultEmitter as @diagnostic::Emitter);
let sess = build_session(sessopts,
@diagnostic::DefaultEmitter as
@diagnostic::Emitter);
let cfg = build_configuration(sess);
assert!((attr::contains_name(cfg, "test")));
}
@ -1083,8 +1087,12 @@ mod test {
}
};
let sessopts = build_session_options(
@"rustc", matches, diagnostic::emit);
let sess = build_session(sessopts, diagnostic::emit);
@"rustc",
matches,
@diagnostic::DefaultEmitter as @diagnostic::Emitter);
let sess = build_session(sessopts,
@diagnostic::DefaultEmitter as
@diagnostic::Emitter);
let cfg = build_configuration(sess);
let mut test_items = cfg.iter().filter(|m| "test" == m.name());
assert!(test_items.next().is_some());

View File

@ -118,14 +118,3 @@ fn test_owned() {
spawn_with_finalizer(owned);
}
#[test]
fn test_managed() {
let i = @mut 10;
let managed: @fn() -> int = || {
let r = *i;
*i += 10;
r
};
assert_eq!(do managed.finally {}, 10);
assert_eq!(*i, 20);
}

View File

@ -217,7 +217,8 @@ pub fn syntax_expander_table() -> SyntaxEnv {
}));
syntax_expanders.insert(intern(&"macro_rules"),
@SE(IdentTT(@SyntaxExpanderTTItem {
expander: SyntaxExpanderTTItemExpanderWithContext(ext::tt::macro_rules::add_new_extension),
expander: SyntaxExpanderTTItemExpanderWithContext(
ext::tt::macro_rules::add_new_extension),
span: None,
} as @SyntaxExpanderTTItemTrait,
None)));

View File

@ -772,7 +772,7 @@ impl ast_fold for IdentRenamer {
// given a mutable list of renames, return a tree-folder that applies those
// renames.
fn renames_to_fold(renames: @mut ~[(ast::Ident,ast::Name)]) -> @ast_fold {
pub fn renames_to_fold(renames: @mut ~[(ast::Ident,ast::Name)]) -> @ast_fold {
@IdentRenamer {
renames: renames,
} as @ast_fold
@ -1524,7 +1524,7 @@ mod test {
let ident_str = @"x";
let tts = string_to_tts(ident_str);
let fm = fresh_mark();
let marked_once = fold::fold_tts(tts,new_mark_folder(fm) as @fold::ast_fold);
let marked_once = fold::fold_tts(tts,new_mark_folder(fm));
assert_eq!(marked_once.len(),1);
let marked_once_ctxt =
match marked_once[0] {

View File

@ -869,7 +869,7 @@ mod test {
use parse::token;
use print::pprust;
use super::*;
// this version doesn't care about getting comments or docstrings in.
fn fake_print_crate(s: @pprust::ps, crate: &ast::Crate) {
pprust::print_mod(s, &crate.module, crate.attrs);
@ -879,7 +879,7 @@ mod test {
struct ToZzIdentFolder;
impl ast_fold for ToZzIdentFolder {
fn fold_ident(&self, _: ident) -> ident {
fn fold_ident(&self, _: ast::Ident) -> ast::Ident {
token::str_to_ident("zz")
}
}
@ -921,16 +921,5 @@ mod test {
token::get_ident_interner()),
~"zz!zz((zz$zz:zz$(zz $zz:zz)zz+=>(zz$(zz$zz$zz)+)))");
}
// and in cast expressions... this appears to be an existing bug.
#[test] fn ident_transformation_in_types () {
let zz_fold = ToZzIdentFolder;
let ast = string_to_crate(@"fn a() {let z = 13 as int;}");
assert_pred!(matches_codepattern,
"matches_codepattern",
pprust::to_str(&zz_fold.fold_crate(ast),fake_print_crate,
token::get_ident_interner()),
~"fn zz(){let zz=13 as zz;}");
}
}

View File

@ -14,7 +14,7 @@ pub struct Entry<A,B> {
}
pub struct alist<A,B> {
eq_fn: @fn(A,A) -> bool,
eq_fn: extern "Rust" fn(A,A) -> bool,
data: @mut ~[Entry<A,B>]
}

View File

@ -1,14 +0,0 @@
// Copyright 2012 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.
pub fn to_closure<A:'static + Clone>(x: A) -> @fn() -> A {
let result: @fn() -> A = || x.clone();
result
}

View File

@ -46,7 +46,6 @@ type nillist = List<()>;
struct State {
box: @nillist,
unique: ~nillist,
fn_box: @fn() -> @nillist,
tuple: (@nillist, ~nillist),
vec: ~[@nillist],
res: r
@ -79,19 +78,15 @@ fn recurse_or_fail(depth: int, st: Option<State>) {
State {
box: @Nil,
unique: ~Nil,
fn_box: || @Nil::<()>,
tuple: (@Nil, ~Nil),
vec: ~[@Nil],
res: r(@Nil)
}
}
Some(st) => {
let fn_box = st.fn_box;
State {
box: @Cons((), st.box),
unique: ~Cons((), @*st.unique),
fn_box: || @Cons((), fn_box()),
tuple: (@Cons((), st.tuple.first()),
~Cons((), @*st.tuple.second())),
vec: st.vec + &[@Cons((), *st.vec.last())],

View File

@ -1,27 +0,0 @@
// Copyright 2012 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.
fn foo(x: @int) -> @fn() -> &'static int {
let result: @fn() -> &'static int = || &*x; //~ ERROR cannot root
result
}
fn bar(x: @int) -> @fn() -> &int {
let result: @fn() -> &int = || &*x; //~ ERROR cannot root
result
}
fn zed(x: @int) -> @fn() -> int {
let result: @fn() -> int = || *&*x;
result
}
fn main() {
}

View File

@ -1,13 +1,13 @@
pub fn main() {
let foo = ~3;
let _pfoo = &foo;
let _f: @fn() -> int = || *foo + 5;
let _f: ~fn() -> int = || *foo + 5;
//~^ ERROR cannot move `foo`
// FIXME(#2202) - Due to the way that borrowck treats closures,
// you get two error reports here.
let bar = ~3;
let _g = || { //~ ERROR capture of moved value
let _h: @fn() -> int = || *bar; //~ ERROR capture of moved value
let _h: ~fn() -> int = || *bar; //~ ERROR capture of moved value
};
}

View File

@ -9,10 +9,10 @@
// except according to those terms.
struct X {
field: @fn:Send(),
field: ~fn:Send(),
}
fn foo(blk: @fn:()) -> X {
fn foo(blk: ~fn:()) -> X {
return X { field: blk }; //~ ERROR expected bounds `Send` but found no bounds
}

View File

@ -8,7 +8,7 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.
fn f(f: @fn(int) -> bool) -> bool { f(10i) }
fn f(f: &fn(int) -> bool) -> bool { f(10i) }
fn main() {
assert!(do f() |i| { i == 10i } == 10i);

View File

@ -1,30 +0,0 @@
// Copyright 2012 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.
fn reproduce<T>(t: T) -> @fn() -> T {
let result: @fn() -> T = || t;
result
}
fn main() {
// type of x is the variable X,
// with the lower bound @mut int
let x = @mut 3;
// type of r is @fn() -> X
let r = reproduce(x);
// Requires that X be a subtype of
// @mut int.
let f: @mut int = r();
// Bad.
let h: @int = r(); //~ ERROR (values differ in mutability)
}

View File

@ -1,32 +0,0 @@
// Copyright 2012 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.
fn mk_identity<T>() -> @fn(T) -> T {
let result: @fn(t: T) -> T = |t| t;
result
}
fn main() {
// type of r is @fn(X) -> X
// for some fresh X
let r = mk_identity();
// @mut int <: X
r(@mut 3);
// @int <: X
//
// Here the type check fails because @const is gone and there is no
// supertype.
r(@3); //~ ERROR mismatched types
// Here the type check succeeds.
*r(@mut 3) = 4;
}

View File

@ -9,8 +9,8 @@
// except according to those terms.
// xfail-test
struct T { f: @fn() };
struct S { f: @fn() };
struct T { f: extern "Rust" fn() };
struct S { f: extern "Rust" fn() };
fn fooS(t: S) {
}
@ -22,11 +22,11 @@ fn bar() {
}
fn main() {
let x: @fn() = bar;
let x: extern "Rust" fn() = bar;
fooS(S {f: x});
fooS(S {f: bar});
let x: @fn() = bar;
let x: extern "Rust" fn() = bar;
fooT(T {f: x});
fooT(T {f: bar});
}

View File

@ -1,26 +0,0 @@
// Copyright 2012 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.
// Test that we require managed closures to be rooted when borrowed.
struct boxedFn<'self> { theFn: &'self fn() -> uint }
fn createClosure (closedUint: uint) -> boxedFn {
let theFn: @fn() -> uint = || closedUint;
boxedFn {theFn: theFn} //~ ERROR cannot root
}
fn main () {
let aFn: boxedFn = createClosure(10);
let myInt: uint = (aFn.theFn)();
assert_eq!(myInt, 10);
}

View File

@ -10,11 +10,11 @@
// xfail-test
fn main() {
let one: @fn() -> uint = || {
let one: &fn() -> uint = || {
enum r { a };
a as uint
};
let two = @fn() -> uint = || {
let two = &fn() -> uint = || {
enum r { a };
a as uint
};

View File

@ -1,3 +1,5 @@
// xfail-test
// Copyright 2012 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.

View File

@ -1,28 +0,0 @@
// Copyright 2012 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.
fn copy1<T:Clone>(t: T) -> @fn() -> T {
let result: @fn() -> T = || t.clone(); //~ ERROR does not fulfill `'static`
result
}
fn copy2<T:Clone + 'static>(t: T) -> @fn() -> T {
let result: @fn() -> T = || t.clone();
result
}
fn main() {
let x = &3;
copy2(&x); //~ ERROR does not fulfill `'static`
copy2(@3);
copy2(@&x); //~ ERROR value may contain borrowed pointers
//~^ ERROR does not fulfill `'static`
}

View File

@ -1,25 +0,0 @@
// Copyright 2012 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.
// Make sure that nesting a block within a @fn doesn't let us
// mutate upvars from a @fn.
fn f2(x: &fn()) { x(); }
fn main() {
let i = 0;
let ctr: @fn() -> int = || { f2(|| i = i + 1 ); i };
//~^ ERROR cannot assign
error!(ctr());
error!(ctr());
error!(ctr());
error!(ctr());
error!(ctr());
error!(i);
}

View File

@ -1,22 +0,0 @@
// Copyright 2012 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.
// Make sure we can't write to upvars from @fns
fn main() {
let i = 0;
let ctr: @fn() -> int = || { i = i + 1; i };
//~^ ERROR cannot assign
error!(ctr());
error!(ctr());
error!(ctr());
error!(ctr());
error!(ctr());
error!(i);
}

View File

@ -9,7 +9,7 @@
// except according to those terms.
fn main() {
let j: @fn() -> int = || {
let j: &fn() -> int = || {
let i: int;
i //~ ERROR use of possibly uninitialized variable: `i`
};

View File

@ -9,7 +9,7 @@
// except according to those terms.
fn main() {
let f: @fn() -> int = || {
let f: &fn() -> int = || {
let i: int;
i //~ ERROR use of possibly uninitialized variable: `i`
};

View File

@ -8,8 +8,8 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.
fn of<T>() -> @fn(T) { fail!(); }
fn subtype<T>(x: @fn(T)) { fail!(); }
fn of<T>() -> &fn(T) { fail!(); }
fn subtype<T>(x: &fn(T)) { fail!(); }
fn test_fn<'x,'y,'z,T>(_x: &'x T, _y: &'y T, _z: &'z T) {
// Here, x, y, and z are free. Other letters
@ -40,18 +40,6 @@ fn test_fn<'x,'y,'z,T>(_x: &'x T, _y: &'y T, _z: &'z T) {
subtype::<&fn<'x,'y>(&'x T, &'y T)>(
of::<&fn<'a,'b>(&'a T, &'b T)>()); //~ ERROR mismatched types
subtype::<&fn<'x,'a>(&'x T) -> @fn(&'a T)>(
of::<&fn<'x,'a>(&'x T) -> @fn(&'a T)>());
subtype::<&fn<'a>(&'a T) -> @fn(&'a T)>(
of::<&fn<'a,'b>(&'a T) -> @fn(&'b T)>()); //~ ERROR mismatched types
subtype::<&fn<'a>(&'a T) -> @fn(&'a T)>(
of::<&fn<'x,'b>(&'x T) -> @fn(&'b T)>()); //~ ERROR mismatched types
subtype::<&fn<'a,'b>(&'a T) -> @fn(&'b T)>(
of::<&fn<'a>(&'a T) -> @fn(&'a T)>());
}
fn main() {}

View File

@ -12,7 +12,7 @@
// we reported errors in this case:
fn not_ok<'b>(a: &uint, b: &'b uint) {
let mut g: @fn(x: &uint) = |x: &'b uint| {};
let mut g: &fn(x: &uint) = |x: &'b uint| {};
//~^ ERROR mismatched types
g(a);
}

View File

@ -13,11 +13,11 @@ struct parameterized1<'self> {
}
struct not_parameterized1 {
g: @fn()
g: &'static fn()
}
struct not_parameterized2 {
g: @fn()
g: &'static fn()
}
fn take1(p: parameterized1) -> parameterized1 { p }

View File

@ -14,7 +14,7 @@
// the normal case.
struct contravariant<'self> {
f: @fn() -> &'self int
f: &'static fn() -> &'self int
}
fn to_same_lifetime<'r>(bi: contravariant<'r>) {

View File

@ -13,7 +13,7 @@
// You can upcast to a *larger region* but not a smaller one.
struct covariant<'self> {
f: @fn(x: &'self int) -> int
f: &'static fn(x: &'self int) -> int
}
fn to_same_lifetime<'r>(bi: covariant<'r>) {

View File

@ -9,7 +9,7 @@
// except according to those terms.
struct invariant<'self> {
f: @fn(x: @mut &'self int)
f: &'static fn(x: @mut &'self int)
}
fn to_same_lifetime<'r>(bi: invariant<'r>) {

View File

@ -9,7 +9,7 @@
// except according to those terms.
struct invariant<'self> {
f: @fn() -> @mut &'self int
f: &'static fn() -> @mut &'self int
}
fn to_same_lifetime<'r>(bi: invariant<'r>) {

View File

@ -14,12 +14,12 @@ struct direct<'self> {
struct indirect1 {
// Here the lifetime parameter of direct is bound by the fn()
g: @fn(direct)
g: &'static fn(direct)
}
struct indirect2<'self> {
// But here it is set to 'self
g: @fn(direct<'self>)
g: &'static fn(direct<'self>)
}
fn take_direct(p: direct) -> direct { p } //~ ERROR mismatched types

View File

@ -1,18 +0,0 @@
// Copyright 2012 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.
fn test(f: @fn(uint) -> uint) -> uint {
return f(22u);
}
fn main() {
let f: ~fn(x: uint) -> uint = |x| 4u;
info!(test(f)); //~ ERROR expected @ closure, found ~ closure
}

View File

@ -1,77 +0,0 @@
// 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.
// compile-flags:-Z extra-debug-info
// debugger:rbreak zzz
// debugger:run
// debugger:finish
// debugger:print x
// check:$1 = false
// debugger:continue
// debugger:finish
// debugger:print x
// check:$2 = false
// debugger:continue
// debugger:finish
// debugger:print x
// check:$3 = 1000
// debugger:continue
// debugger:finish
// debugger:print x
// check:$4 = 2.5
// debugger:continue
// debugger:finish
// debugger:print x
// check:$5 = true
// debugger:continue
// debugger:finish
// debugger:print x
// check:$6 = false
// debugger:continue
fn main() {
let x = false;
zzz();
sentinel();
let managed_closure: @fn(int) = |x| {
zzz();
sentinel();
let x = 2.5;
zzz();
sentinel();
let x = true;
zzz();
sentinel();
};
zzz();
sentinel();
managed_closure(1000);
zzz();
sentinel();
}
fn zzz() {()}
fn sentinel() {()}

View File

@ -1,56 +0,0 @@
// 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.
// compile-flags:-Z extra-debug-info
// debugger:rbreak zzz
// debugger:run
// debugger:finish
// debugger:print constant
// check:$1 = 1
// debugger:print a_struct
// check:$2 = {a = -2, b = 3.5, c = 4}
// debugger:print *owned
// check:$3 = 5
// debugger:print managed->val
// check:$4 = 6
#[allow(unused_variable)];
struct Struct {
a: int,
b: float,
c: uint
}
fn main() {
let constant = 1;
let a_struct = Struct {
a: -2,
b: 3.5,
c: 4
};
let owned = ~5;
let managed = @6;
let closure: @fn() = || {
zzz();
do_something(&constant, &a_struct.a, owned, managed);
};
closure();
}
fn do_something(_: &int, _:&int, _:&int, _:&int) {
}
fn zzz() {()}

View File

@ -1,12 +0,0 @@
// Copyright 2012 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.
fn blk1(_b: &fn()) -> @fn() { return || { }; }
fn test1() { (do blk1 { info!("hi"); })(); }

View File

@ -10,6 +10,6 @@
// pp-exact
fn f(f: @fn(int)) { f(10) }
fn f(f: &fn(int)) { f(10) }
fn main() { do f |i| { assert!(i == 10) } }

View File

@ -12,6 +12,5 @@
fn from_foreign_fn(_x: extern "Rust" fn()) { }
fn from_stack_closure(_x: &fn()) { }
fn from_box_closure(_x: @fn()) { }
fn from_unique_closure(_x: ~fn()) { }
fn main() { }

View File

@ -1,24 +0,0 @@
// Copyright 2012 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.
// error-pattern:fail
fn failfn() {
fail!();
}
fn main() {
let y = ~0;
let x: @@fn() = @|| {
error!(y.clone());
};
failfn();
error!(x);
}

View File

@ -1,21 +0,0 @@
// Copyright 2012 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.
// error-pattern:fail
fn f(_a: @int) {
fail!();
}
fn main() {
let b = @0;
let g: @fn() = || f(b);
g();
}

View File

@ -14,7 +14,7 @@ fn main() {
let cheese = ~"roquefort";
let carrots = @~"crunchy";
let result: @fn(@~str, &fn(~str)) = (|tasties, macerate| {
let result: &'static fn(@~str, &fn(~str)) = (|tasties, macerate| {
macerate((*tasties).clone());
});
result(carrots, |food| {

View File

@ -12,13 +12,30 @@ struct pair<A,B> {
a: A, b: B
}
fn f<A:Clone + 'static>(a: A, b: u16) -> @fn() -> (A, u16) {
let result: @fn() -> (A, u16) = || (a.clone(), b);
result
trait Invokable<A> {
fn f(&self) -> (A, u16);
}
struct Invoker<A> {
a: A,
b: u16,
}
impl<A:Clone> Invokable<A> for Invoker<A> {
fn f(&self) -> (A, u16) {
(self.a.clone(), self.b)
}
}
fn f<A:Clone + 'static>(a: A, b: u16) -> @Invokable<A> {
@Invoker {
a: a,
b: b,
} as @Invokable<A>
}
pub fn main() {
let (a, b) = f(22_u64, 44u16)();
let (a, b) = f(22_u64, 44u16).f();
info!("a=%? b=%?", a, b);
assert_eq!(a, 22u64);
assert_eq!(b, 44u16);

View File

@ -23,13 +23,30 @@ fn make_cycle<A:'static>(a: A) {
g.rec = Some(g);
}
struct Invoker<A,B> {
a: A,
b: B,
}
trait Invokable<A,B> {
fn f(&self) -> (A, B);
}
impl<A:Clone,B:Clone> Invokable<A,B> for Invoker<A,B> {
fn f(&self) -> (A, B) {
(self.a.clone(), self.b.clone())
}
}
fn f<A:Send + Clone + 'static,
B:Send + Clone + 'static>(
a: A,
b: B)
-> @fn() -> (A, B) {
let result: @fn() -> (A, B) = || (a.clone(), b.clone());
result
-> @Invokable<A,B> {
@Invoker {
a: a,
b: b,
} as @Invokable<A,B>
}
pub fn main() {
@ -37,7 +54,7 @@ pub fn main() {
let y = 44_u64;
let z = f(~x, y);
make_cycle(z);
let (a, b) = z();
let (a, b) = z.f();
info!("a=%u b=%u", *a as uint, b as uint);
assert_eq!(*a, x);
assert_eq!(b, y);

View File

@ -14,10 +14,6 @@ fn asSendfn( f : ~fn()->uint ) -> uint {
return f();
}
fn asLambda( f : @fn()->uint ) -> uint {
return f();
}
fn asBlock( f : &fn()->uint ) -> uint {
return f();
}
@ -25,8 +21,6 @@ fn asBlock( f : &fn()->uint ) -> uint {
pub fn main() {
let x = asSendfn(|| 22u);
assert_eq!(x, 22u);
let x = asLambda(|| 22u);
assert_eq!(x, 22u);
let x = asBlock(|| 22u);
assert_eq!(x, 22u);
}

View File

@ -1,24 +0,0 @@
// Copyright 2012 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.
fn to_lambda(f: @fn(uint) -> uint) -> @fn(uint) -> uint {
return f;
}
pub fn main() {
let x: @fn(uint) -> uint = to_lambda(|x| x * 2u );
let y = to_lambda(x);
let x_r = x(22u);
let y_r = y(x_r);
assert_eq!(x_r, 44u);
assert_eq!(y_r, 88u);
}

View File

@ -1,5 +1,5 @@
pub fn main() {
let bar = ~3;
let h: @fn() -> int = || *bar;
let h: ~fn() -> int = || *bar;
assert_eq!(h(), 3);
}

View File

@ -11,7 +11,7 @@
fn foo() -> int { 22 }
pub fn main() {
let mut x: ~[@fn() -> int] = ~[];
let mut x: ~[extern "Rust" fn() -> int] = ~[];
x.push(foo);
assert_eq!((x[0])(), 22);
}

View File

@ -11,16 +11,6 @@
use std::ptr;
pub fn main() {
let x = ~1;
let y = ptr::to_unsafe_ptr(&(*x)) as uint;
let lam_move: @fn() -> uint = || ptr::to_unsafe_ptr(&(*x)) as uint;
assert_eq!(lam_move(), y);
let x = ~2;
let y = ptr::to_unsafe_ptr(&(*x)) as uint;
let lam_move: @fn() -> uint = || ptr::to_unsafe_ptr(&(*x)) as uint;
assert_eq!(lam_move(), y);
let x = ~3;
let y = ptr::to_unsafe_ptr(&(*x)) as uint;
let snd_move: ~fn() -> uint = || ptr::to_unsafe_ptr(&(*x)) as uint;

View File

@ -16,13 +16,30 @@ struct Pair<A,B> {
a: A, b: B
}
fn f<A:Clone + 'static>(a: A, b: u16) -> @fn() -> (A, u16) {
let result: @fn() -> (A, u16) = || (a.clone(), b);
result
struct Invoker<A> {
a: A,
b: u16,
}
trait Invokable<A> {
fn f(&self) -> (A, u16);
}
impl<A:Clone> Invokable<A> for Invoker<A> {
fn f(&self) -> (A, u16) {
(self.a.clone(), self.b)
}
}
fn f<A:Clone + 'static>(a: A, b: u16) -> @Invokable<A> {
@Invoker {
a: a,
b: b,
} as @Invokable<A>
}
pub fn main() {
let (a, b) = f(22_u64, 44u16)();
let (a, b) = f(22_u64, 44u16).f();
info!("a=%? b=%?", a, b);
assert_eq!(a, 22u64);
assert_eq!(b, 44u16);

View File

@ -8,13 +8,33 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.
struct foo { z: @fn() }
struct foo {
z: Option<@Invokable>,
}
struct Thing {
w: @mut foo,
}
trait Invokable {
fn f(&self);
}
impl Invokable for Thing {
fn f(&self) {
nop_foo(self.w);
}
}
fn nop() { }
fn nop_foo(_x : @mut foo) { }
pub fn main() {
let w = @mut foo{ z: || nop() };
let x: @fn() = || nop_foo(w);
w.z = x;
let w = @mut foo {
z: None,
};
let x = @Thing {
w: w,
} as @Invokable;
w.z = Some(x);
}

View File

@ -1,20 +0,0 @@
// Copyright 2012 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.
struct foo { z : @fn() }
fn nop() { }
fn nop_foo(_y: ~[int], _x : @mut foo) { }
pub fn main() {
let w = @mut foo{ z: || nop() };
let x : @fn() = || nop_foo(~[], w);
w.z = x;
}

View File

@ -1,22 +0,0 @@
// Copyright 2012 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.
struct foo { z: @fn() }
fn nop() { }
fn nop_foo(_y: @int, _x: @mut foo) { }
fn o() -> @int { @10 }
pub fn main() {
let w = @mut foo { z: || nop() };
let x : @fn() = || nop_foo(o(), w);
w.z = x;
}

View File

@ -10,9 +10,9 @@
// Testing that we can drop the || in do exprs
fn f(_f: @fn() -> bool) -> bool { true }
fn f(_f: &fn() -> bool) -> bool { true }
fn d(_f: @fn()) { }
fn d(_f: &fn()) { }
pub fn main() {
do d { }

View File

@ -8,7 +8,7 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.
fn f(f: @fn(int)) { f(10) }
fn f(f: &fn(int)) { f(10) }
pub fn main() {
do f() |i| { assert!(i == 10) }

View File

@ -8,7 +8,7 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.
fn f(f: @fn(int) -> int) -> int { f(10) }
fn f(f: &fn(int) -> int) -> int { f(10) }
pub fn main() {
assert_eq!(do f() |i| { i }, 10);

View File

@ -8,7 +8,7 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.
fn f(f: @fn(int) -> int) -> int { f(10) }
fn f(f: &fn(int) -> int) -> int { f(10) }
pub fn main() {
assert_eq!(do f |i| { i }, 10);

View File

@ -11,7 +11,7 @@
fn test_fn() {
type t = @fn() -> int;
type t = &'static fn() -> int;
fn ten() -> int { return 10; }
let rs: t = { ten };
assert!((rs() == 10));

View File

@ -12,7 +12,7 @@
// -*- rust -*-
type compare<T> = @fn(@T, @T) -> bool;
type compare<T> = &'static fn(@T, @T) -> bool;
fn test_generic<T>(expected: @T, eq: compare<T>) {
let actual: @T = { expected };

View File

@ -11,7 +11,7 @@
// xfail-fast
type compare<T> = @fn(T, T) -> bool;
type compare<'self, T> = &'self fn(T, T) -> bool;
fn test_generic<T:Clone>(expected: T, eq: compare<T>) {
let actual: T = { expected.clone() };

View File

@ -11,7 +11,7 @@
// -*- rust -*-
type compare<T> = @fn(~T, ~T) -> bool;
type compare<'self, T> = &'self fn(~T, ~T) -> bool;
fn test_generic<T:Clone>(expected: ~T, eq: compare<T>) {
let actual: ~T = { expected.clone() };

View File

@ -11,7 +11,7 @@
// xfail-fast
// -*- rust -*-
type compare<T> = @fn(T, T) -> bool;
type compare<'self, T> = &'self fn(T, T) -> bool;
fn test_generic<T:Clone>(expected: T, eq: compare<T>) {
let actual: T = { expected.clone() };

View File

@ -13,7 +13,7 @@
// xfail-fast
// Tests for standalone blocks as expressions with dynamic type sizes
type compare<T> = @fn(T, T) -> bool;
type compare<'self, T> = &'self fn(T, T) -> bool;
fn test_generic<T:Clone>(expected: T, eq: compare<T>) {
let actual: T = { expected.clone() };

View File

@ -12,7 +12,7 @@
// -*- rust -*-
type compare<T> = @fn(@T, @T) -> bool;
type compare<T> = &'static fn(@T, @T) -> bool;
fn test_generic<T>(expected: @T, not_expected: @T, eq: compare<T>) {
let actual: @T = if true { expected } else { not_expected };

View File

@ -11,7 +11,7 @@
// xfail-fast
// -*- rust -*-
type compare<T> = @fn(T, T) -> bool;
type compare<T> = &'static fn(T, T) -> bool;
fn test_generic<T:Clone>(expected: T, not_expected: T, eq: compare<T>) {
let actual: T = if true { expected.clone() } else { not_expected };

View File

@ -12,7 +12,7 @@
// -*- rust -*-
// Tests for if as expressions with dynamic type sizes
type compare<T> = @fn(T, T) -> bool;
type compare<T> = &'static fn(T, T) -> bool;
fn test_generic<T:Clone>(expected: T, not_expected: T, eq: compare<T>) {
let actual: T = if true { expected.clone() } else { not_expected };

View File

@ -12,7 +12,7 @@
// -*- rust -*-
type compare<T> = @fn(@T, @T) -> bool;
type compare<T> = &'static fn(@T, @T) -> bool;
fn test_generic<T>(expected: @T, eq: compare<T>) {
let actual: @T = match true { true => { expected }, _ => fail!() };

View File

@ -11,7 +11,7 @@
// xfail-fast
// -*- rust -*-
type compare<T> = @fn(T, T) -> bool;
type compare<T> = &'static fn(T, T) -> bool;
fn test_generic<T:Clone>(expected: T, eq: compare<T>) {
let actual: T = match true { true => { expected.clone() }, _ => fail!("wat") };

View File

@ -11,7 +11,7 @@
// -*- rust -*-
type compare<T> = @fn(~T, ~T) -> bool;
type compare<T> = &'static fn(~T, ~T) -> bool;
fn test_generic<T:Clone>(expected: ~T, eq: compare<T>) {
let actual: ~T = match true {

View File

@ -11,7 +11,7 @@
// xfail-fast
// -*- rust -*-
type compare<T> = @fn(T, T) -> bool;
type compare<'self, T> = &'self fn(T, T) -> bool;
fn test_generic<T:Clone>(expected: T, eq: compare<T>) {
let actual: T = match true {

View File

@ -11,7 +11,7 @@
// xfail-fast
// -*- rust -*-
type compare<T> = @fn(T, T) -> bool;
type compare<T> = extern "Rust" fn(T, T) -> bool;
fn test_generic<T:Clone>(expected: T, eq: compare<T>) {
let actual: T = match true { true => { expected.clone() }, _ => fail!("wat") };

View File

@ -1,30 +0,0 @@
// Copyright 2012 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.
// xfail-fast
fn fix_help<A, B>(f: extern fn(@fn(A) -> B, A) -> B, x: A) -> B {
return f( |a| fix_help(f, a), x);
}
fn fix<A, B>(f: extern fn(@fn(A) -> B, A) -> B) -> @fn(A) -> B {
return |a| fix_help(f, a);
}
fn fact_(f: @fn(v: int) -> int, n: int) -> int {
// fun fact 0 = 1
return if n == 0 { 1 } else { n * f(n - 1) };
}
pub fn main() {
let fact = fix(fact_);
assert_eq!(fact(5), 120);
assert_eq!(fact(2), 2);
}

View File

@ -1,30 +0,0 @@
// Copyright 2012 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.
// xfail-fast
fn fix_help<A:'static,B:Send>(f: extern fn(@fn(A) -> B, A) -> B, x: A) -> B {
return f(|a| fix_help(f, a), x);
}
fn fix<A:'static,B:Send>(f: extern fn(@fn(A) -> B, A) -> B) -> @fn(A) -> B {
return |a| fix_help(f, a);
}
fn fact_(f: @fn(v: int) -> int, n: int) -> int {
// fun fact 0 = 1
return if n == 0 { 1 } else { n * f(n - 1) };
}
pub fn main() {
let fact = fix(fact_);
assert_eq!(fact(5), 120);
assert_eq!(fact(2), 2);
}

View File

@ -1,20 +0,0 @@
// Copyright 2012 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.
fn add(n: int) -> @fn(int) -> int {
let result: @fn(int) -> int = |m| m + n;
result
}
pub fn main() {
assert_eq!(add(3)(4), 7);
let add3 : &fn(int)->int = add(3);
assert_eq!(add3(4), 7);
}

View File

@ -1,28 +0,0 @@
// Copyright 2012 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.
fn add(n: int) -> @fn(int) -> int {
let result: @fn(int) -> int = |m| m + n;
result
}
pub fn main()
{
assert_eq!(add(3)(4), 7);
let add1 : @fn(int)->int = add(1);
assert_eq!(add1(6), 7);
let add2 : &(@fn(int)->int) = &add(2);
assert_eq!((*add2)(5), 7);
let add3 : &fn(int)->int = add(3);
assert_eq!(add3(4), 7);
}

View File

@ -1,17 +0,0 @@
// Copyright 2012 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.
fn bare() {}
fn likes_shared(f: @fn()) { f() }
pub fn main() {
likes_shared(bare);
}

View File

@ -8,8 +8,8 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.
struct r {
field: @fn()
struct r<'self> {
field: &'self fn()
}
pub fn main() {

View File

@ -11,7 +11,7 @@
#[allow(unused_variable)];
pub fn main() {
// We should be able to type infer inside of @fns.
// We should be able to type infer inside of &fns.
let _f = || {
let i = 10;
};

View File

@ -9,7 +9,7 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.
fn ho(f: @fn(int) -> int) -> int { let n: int = f(3); return n; }
fn ho(f: &fn(int) -> int) -> int { let n: int = f(3); return n; }
fn direct(x: int) -> int { return x + 1; }

View File

@ -24,7 +24,7 @@ mod map_reduce {
use std::str;
use std::task;
pub type putter = @fn(~str, ~str);
pub type putter<'self> = &'self fn(~str, ~str);
pub type mapper = extern fn(~str, putter);

View File

@ -1,25 +0,0 @@
// Copyright 2012 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.
// Tests the passing down of expected types through boxing and
// wrapping in a record or tuple. (The a.x would complain about 'this
// type must be known in this context' if the passing down doesn't
// happen.)
fn eat_tup(_r: ~@(int, @fn(Pair) -> int)) {}
fn eat_rec(_r: ~Rec) {}
struct Rec<'self> { a: int, b: &'self fn(Pair) -> int }
struct Pair { x: int, y: int }
pub fn main() {
eat_tup(~@(10, |a| a.x ));
eat_rec(~Rec{a: 10, b: |a| a.x });
}

View File

@ -9,5 +9,5 @@
// except according to those terms.
pub fn main() {
let early_error: @fn(&str) -> ! = |_msg| { fail!() };
let early_error: &'static fn(&str) -> ! = |_msg| { fail!() };
}

View File

@ -18,11 +18,11 @@
//
// Running /usr/local/bin/rustc:
// issue-2185.rs:24:0: 26:1 error: conflicting implementations for a trait
// issue-2185.rs:24 impl iterable<uint> for @fn(&fn(uint)) {
// issue-2185.rs:24 impl iterable<uint> for &'static fn(&fn(uint)) {
// issue-2185.rs:25 fn iter(&self, blk: &fn(v: uint)) { self( |i| blk(i) ) }
// issue-2185.rs:26 }
// issue-2185.rs:20:0: 22:1 note: note conflicting implementation here
// issue-2185.rs:20 impl<A> iterable<A> for @fn(&fn(A)) {
// issue-2185.rs:20 impl<A> iterable<A> for &'static fn(&fn(A)) {
// issue-2185.rs:21 fn iter(&self, blk: &fn(A)) { self(blk); }
// issue-2185.rs:22 }
//
@ -42,15 +42,17 @@ trait iterable<A> {
fn iter(&self, blk: &fn(A));
}
impl<A> iterable<A> for @fn(&fn(A)) {
impl<A> iterable<A> for &'static fn(&fn(A)) {
fn iter(&self, blk: &fn(A)) { self(blk); }
}
impl iterable<uint> for @fn(&fn(uint)) {
impl iterable<uint> for &'static fn(&fn(uint)) {
fn iter(&self, blk: &fn(v: uint)) { self( |i| blk(i) ) }
}
fn filter<A,IA:iterable<A>>(self: IA, prd: @fn(A) -> bool, blk: &fn(A)) {
fn filter<A,IA:iterable<A>>(self: IA,
prd: &'static fn(A) -> bool,
blk: &fn(A)) {
do self.iter |a| {
if prd(a) { blk(a) }
}
@ -73,8 +75,8 @@ fn range(lo: uint, hi: uint, it: &fn(uint)) {
}
pub fn main() {
let range: @fn(&fn(uint)) = |a| range(0u, 1000u, a);
let filt: @fn(&fn(v: uint)) = |a| filter(
let range: &'static fn(&fn(uint)) = |a| range(0u, 1000u, a);
let filt: &'static fn(&fn(v: uint)) = |a| filter(
range,
|&&n: uint| n % 3u != 0u && n % 5u != 0u,
a);

View File

@ -9,12 +9,16 @@
// except according to those terms.
struct cat {
meow: @fn(),
meow: extern "Rust" fn(),
}
fn meow() {
error!("meow")
}
fn cat() -> cat {
cat {
meow: || error!("meow")
meow: meow,
}
}

View File

@ -8,7 +8,7 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.
type Connection = @fn(~[u8]);
type Connection = &'static fn(~[u8]);
fn f() -> Option<Connection> {
let mock_connection: Connection = |_| {};

View File

@ -10,6 +10,6 @@
pub fn main() {
let x = 1;
let y: @fn() -> int = || x;
let y: &fn() -> int = || x;
let _z = y();
}

View File

@ -1,12 +0,0 @@
// 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.
fn make_adder(x: int) -> @fn(int) -> int { |y| x + y }
pub fn main() { }

View File

@ -1,19 +0,0 @@
// 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.
// Issue #5783
// Nondeterministic behavior when referencing a closure more than once
fn main() {
let a: &fn(int) -> @fn(int) -> int = |x:int| |y:int| -> int x + y;
let b = a(2);
assert!(a(2)(3) == 5);
assert!(b(6) == 8);
}

View File

@ -1,25 +0,0 @@
// Copyright 2012 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.
// xfail-fast - check-fast doesn't understand aux-build
// aux-build:issue4516_ty_param_lib.rs
// Trigger a bug concerning inlining of generic functions.
// The def-ids in type parameters were not being correctly
// resolved and hence when we checked the type of the closure
// variable (see the library mod) to determine if the value
// should be moved into the closure, trans failed to find
// the relevant kind bounds.
extern mod issue4516_ty_param_lib;
use issue4516_ty_param_lib::to_closure;
pub fn main() {
to_closure(22)();
}

View File

@ -9,13 +9,13 @@
// except according to those terms.
// This should typecheck even though the type of e is not fully
// resolved when we finish typechecking the @fn.
// resolved when we finish typechecking the &fn.
struct Refs { refs: ~[int], n: int }
pub fn main() {
let e = @mut Refs{refs: ~[], n: 0};
let _f: @fn() = || error!(e.n);
let _f: &fn() = || error!(e.n);
e.refs.push(1);
}

View File

@ -1,17 +0,0 @@
// Copyright 2012 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.
// Make sure we don't leak @fns in silly ways.
fn force(f: @fn()) { f() }
pub fn main() {
let x = 7;
let _f: @fn() = || error!(x);
force(|| error!(x));
}

View File

@ -12,10 +12,10 @@
struct A { a: ~int }
fn foo() -> @fn() -> int {
fn foo() -> &'static fn() -> int {
let k = ~22;
let _u = A {a: k.clone()};
let result: @fn() -> int = || 22;
let result: &'static fn() -> int = || 22;
result
}

View File

@ -13,7 +13,7 @@
struct A { a: ~int }
pub fn main() {
fn invoke(f: @fn()) { f(); }
fn invoke(f: &fn()) { f(); }
let k = ~22;
let _u = A {a: k.clone()};
invoke(|| error!(k.clone()) )

View File

@ -1,30 +0,0 @@
// Copyright 2012 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.
// test that invoking functions which require
// dictionaries from inside an @fn works
// (at one point, it didn't)
fn mk_nil<C:ty_ops>(cx: C) -> uint {
cx.mk()
}
trait ty_ops {
fn mk(&self) -> uint;
}
impl ty_ops for () {
fn mk(&self) -> uint { 22u }
}
pub fn main() {
let fn_env: @fn() -> uint = || mk_nil(());
assert_eq!(fn_env(), 22u);
}

View File

@ -9,9 +9,9 @@
// except according to those terms.
// Issue #922
fn f2(_thing: @fn()) { }
fn f2(_thing: &fn()) { }
fn f(thing: @fn()) {
fn f(thing: &fn()) {
f2(thing);
}

View File

@ -11,8 +11,6 @@
// Test that the lambda kind is inferred correctly as a return
// expression
fn shared() -> @fn() { return || (); }
fn unique() -> ~fn() { return || (); }
pub fn main() {

View File

@ -11,8 +11,6 @@
// Test that the lambda kind is inferred correctly as a return
// expression
fn shared() -> @fn() { || () }
fn unique() -> ~fn() { || () }
pub fn main() {

View File

@ -14,16 +14,9 @@ fn f(i: int, f: &fn(int) -> int) -> int { f(i) }
fn g(_g: &fn()) { }
fn ff() -> @fn(int) -> int {
return |x| x + 1;
}
pub fn main() {
assert_eq!(f(10, |a| a), 10);
g(||());
assert_eq!(do f(10) |a| { a }, 10);
do g() { }
let _x: @fn() -> int = || 10;
let _y: @fn(int) -> int = |a| a;
assert_eq!(ff()(10), 11);
}

View File

@ -1,12 +0,0 @@
// Test that expected type propagates through `{}` expressions. If it
// did not, then the type of `x` would not be known and a compilation
// error would result.
pub fn main() {
let y = ~3;
let foo: @fn(&int) -> int = {
let y = y.clone();
|x| *x + *y
};
assert_eq!(foo(@22), 25);
}

View File

@ -460,9 +460,9 @@ impl<V:TyVisitor + movable_ptr> TyVisitor for ptr_visit_adaptor<V> {
}
fn visit_closure_ptr(&mut self, ck: uint) -> bool {
self.align_to::<@fn()>();
self.align_to::<(uint,uint)>();
if ! self.inner.visit_closure_ptr(ck) { return false; }
self.bump_past::<@fn()>();
self.bump_past::<(uint,uint)>();
true
}
}

Some files were not shown because too many files have changed in this diff Show More