about summary refs log tree commit diff
diff options
context:
space:
mode:
authorNiko Matsakis <niko@alum.mit.edu>2014-11-26 06:47:14 -0500
committerNiko Matsakis <niko@alum.mit.edu>2014-12-22 12:27:08 -0500
commit41ef2d85a1c685002230e0c05165c115b502486b (patch)
tree82f5fadf96203690db2344296ee578f60e2281cc
parent8fe9e4dff6d9d0fdd940835ae377edcb3754f8c1 (diff)
downloadrust-41ef2d85a1c685002230e0c05165c115b502486b.tar.gz
rust-41ef2d85a1c685002230e0c05165c115b502486b.zip
Various simple tests for fn item type vs fn pointer type and for coercions between them.
-rw-r--r--src/test/compile-fail/fn-item-type.rs25
-rw-r--r--src/test/run-pass/fn-item-type-cast.rs28
-rw-r--r--src/test/run-pass/fn-item-type-coerce.rs23
3 files changed, 76 insertions, 0 deletions
diff --git a/src/test/compile-fail/fn-item-type.rs b/src/test/compile-fail/fn-item-type.rs
new file mode 100644
index 00000000000..dd4a24bfb2f
--- /dev/null
+++ b/src/test/compile-fail/fn-item-type.rs
@@ -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
+}
diff --git a/src/test/run-pass/fn-item-type-cast.rs b/src/test/run-pass/fn-item-type-cast.rs
new file mode 100644
index 00000000000..bfd02f5e27b
--- /dev/null
+++ b/src/test/run-pass/fn-item-type-cast.rs
@@ -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);
+}
diff --git a/src/test/run-pass/fn-item-type-coerce.rs b/src/test/run-pass/fn-item-type-coerce.rs
new file mode 100644
index 00000000000..8427a0f4446
--- /dev/null
+++ b/src/test/run-pass/fn-item-type-coerce.rs
@@ -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);
+}