Various simple tests for fn item type vs fn pointer type and for coercions between them.
This commit is contained in:
parent
8fe9e4dff6
commit
41ef2d85a1
25
src/test/compile-fail/fn-item-type.rs
Normal file
25
src/test/compile-fail/fn-item-type.rs
Normal file
@ -0,0 +1,25 @@
|
||||
// Copyright 2014 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 the types of distinct fn items are not compatible by
|
||||
// default. See also `run-pass/fn-item-type-*.rs`.
|
||||
|
||||
fn foo(x: int) -> int { x * 2 }
|
||||
fn bar(x: int) -> int { x * 4 }
|
||||
|
||||
fn eq<T>(x: T, y: T) { }
|
||||
|
||||
fn main() {
|
||||
let f = if true { foo } else { bar };
|
||||
//~^ ERROR expected fn item, found a different fn item
|
||||
|
||||
eq(foo, bar);
|
||||
//~^ ERROR expected fn item, found a different fn item
|
||||
}
|
28
src/test/run-pass/fn-item-type-cast.rs
Normal file
28
src/test/run-pass/fn-item-type-cast.rs
Normal file
@ -0,0 +1,28 @@
|
||||
// Copyright 2014 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 explicit coercions from a fn item type to a fn pointer type.
|
||||
|
||||
fn foo(x: int) -> int { x * 2 }
|
||||
fn bar(x: int) -> int { x * 4 }
|
||||
type IntMap = fn(int) -> int;
|
||||
|
||||
fn eq<T>(x: T, y: T) { }
|
||||
|
||||
static TEST: Option<IntMap> = Some(foo as IntMap);
|
||||
|
||||
fn main() {
|
||||
let f = foo as IntMap;
|
||||
|
||||
let f = if true { foo as IntMap } else { bar as IntMap };
|
||||
assert_eq!(f(4), 8);
|
||||
|
||||
eq(foo as IntMap, bar as IntMap);
|
||||
}
|
23
src/test/run-pass/fn-item-type-coerce.rs
Normal file
23
src/test/run-pass/fn-item-type-coerce.rs
Normal file
@ -0,0 +1,23 @@
|
||||
// Copyright 2014 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 implicit coercions from a fn item type to a fn pointer type.
|
||||
|
||||
fn foo(x: int) -> int { x * 2 }
|
||||
fn bar(x: int) -> int { x * 4 }
|
||||
type IntMap = fn(int) -> int;
|
||||
|
||||
fn eq<T>(x: T, y: T) { }
|
||||
|
||||
fn main() {
|
||||
let f: IntMap = foo;
|
||||
|
||||
eq::<IntMap>(foo, bar);
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user