From de403180376c80f9ef8cb8e90d12b3c936e160d2 Mon Sep 17 00:00:00 2001 From: Tim Chevalier Date: Fri, 1 Jun 2012 17:48:07 -0700 Subject: [PATCH] Tests for copyability and sendability rules for classes Closes #2296 --- src/test/compile-fail/noncopyable-class.rs | 16 ++++++++++++++++ src/test/compile-fail/unsendable-class.rs | 15 +++++++++++++++ src/test/run-pass/sendable-class.rs | 13 +++++++++++++ 3 files changed, 44 insertions(+) create mode 100644 src/test/compile-fail/noncopyable-class.rs create mode 100644 src/test/compile-fail/unsendable-class.rs create mode 100644 src/test/run-pass/sendable-class.rs diff --git a/src/test/compile-fail/noncopyable-class.rs b/src/test/compile-fail/noncopyable-class.rs new file mode 100644 index 000000000000..da0a0a488f50 --- /dev/null +++ b/src/test/compile-fail/noncopyable-class.rs @@ -0,0 +1,16 @@ +// error-pattern: copying a noncopyable value + +// Test that a class with a non-copyable field can't be +// copied +class bar { + new() {} + drop {} +} + +class foo { + let i: int; + let j: bar; + new(i:int) { self.i = i; self.j = bar(); } +} + +fn main() { let x <- foo(10); let y = x; log(error, x); } diff --git a/src/test/compile-fail/unsendable-class.rs b/src/test/compile-fail/unsendable-class.rs new file mode 100644 index 000000000000..689253ddeef2 --- /dev/null +++ b/src/test/compile-fail/unsendable-class.rs @@ -0,0 +1,15 @@ +// Test that a class with an unsendable field can't be +// sent + +class foo { + let i: int; + let j: @str; + new(i:int, j: @str) { self.i = i; self.j = j; } +} + +fn main() { + let cat = "kitty"; + let po = comm::port(); //! ERROR missing `send` + let ch = comm::chan(po); //! ERROR missing `send` + comm::send(ch, foo(42, @cat)); //! ERROR missing `send` +} \ No newline at end of file diff --git a/src/test/run-pass/sendable-class.rs b/src/test/run-pass/sendable-class.rs new file mode 100644 index 000000000000..b421f8cdf2ef --- /dev/null +++ b/src/test/run-pass/sendable-class.rs @@ -0,0 +1,13 @@ +// Test that a class with only sendable fields can be sent + +class foo { + let i: int; + let j: char; + new(i:int, j: char) { self.i = i; self.j = j; } +} + +fn main() { + let po = comm::port::(); + let ch = comm::chan(po); + comm::send(ch, foo(42, 'c')); +} \ No newline at end of file