about summary refs log tree commit diff
diff options
context:
space:
mode:
authorNick Cameron <ncameron@mozilla.com>2014-10-13 16:00:45 +1300
committerNick Cameron <ncameron@mozilla.com>2014-10-15 17:38:32 +1300
commitdb640d53b82f70540092b70aa8decade97e55d63 (patch)
treea66ac27f656a4edc3abd48dd75d640d315a0e43d
parentd3f51dcab85f6878fd25636bf1c8b8d4cf35b4ce (diff)
downloadrust-db640d53b82f70540092b70aa8decade97e55d63.tar.gz
rust-db640d53b82f70540092b70aa8decade97e55d63.zip
tests
-rw-r--r--src/test/compile-fail/method-self-arg-1.rs24
-rw-r--r--src/test/compile-fail/method-self-arg-2.rs27
-rw-r--r--src/test/run-pass/method-self-arg.rs54
3 files changed, 105 insertions, 0 deletions
diff --git a/src/test/compile-fail/method-self-arg-1.rs b/src/test/compile-fail/method-self-arg-1.rs
new file mode 100644
index 00000000000..82d75b45394
--- /dev/null
+++ b/src/test/compile-fail/method-self-arg-1.rs
@@ -0,0 +1,24 @@
+// 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 method calls with self as an argument cannot subvert type checking.
+
+struct Foo;
+
+impl Foo {
+    fn bar(&self) {}
+}
+
+fn main() {
+    let x = Foo;
+    Foo::bar(x); //~ERROR mismatched types: expected `&Foo`, found `Foo`
+    Foo::bar(&&x); //~ERROR mismatched types: expected `&Foo`, found `&&Foo`
+    Foo::bar(&42i); //~ERROR mismatched types: expected `&Foo`, found `&int`
+}
diff --git a/src/test/compile-fail/method-self-arg-2.rs b/src/test/compile-fail/method-self-arg-2.rs
new file mode 100644
index 00000000000..0ac0851619c
--- /dev/null
+++ b/src/test/compile-fail/method-self-arg-2.rs
@@ -0,0 +1,27 @@
+// 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 method calls with self as an argument cannot subvert borrow checking.
+
+struct Foo;
+
+impl Foo {
+    fn bar(&self) {}
+    fn baz(&mut self) {}
+}
+
+fn main() {
+    let mut x = Foo;
+    let y = &mut x;
+    Foo::bar(&x); //~ERROR cannot borrow `x`
+
+    let x = Foo;
+    Foo::baz(&x); //~ERROR cannot borrow immutable dereference of `&`-pointer as mutable
+}
diff --git a/src/test/run-pass/method-self-arg.rs b/src/test/run-pass/method-self-arg.rs
new file mode 100644
index 00000000000..3d73f34f8cf
--- /dev/null
+++ b/src/test/run-pass/method-self-arg.rs
@@ -0,0 +1,54 @@
+// 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 method calls with self as an argument
+
+static mut COUNT: uint = 1;
+
+struct Foo;
+
+impl Foo {
+    fn foo(self, x: &Foo) {
+        unsafe { COUNT *= 2; }
+        // Test internal call.
+        Foo::bar(&self);
+        Foo::bar(x);
+
+        Foo::baz(self);
+        Foo::baz(*x);
+
+        Foo::qux(box self);
+        Foo::qux(box *x);
+    }
+
+    fn bar(&self) {
+        unsafe { COUNT *= 3; }
+    }
+
+    fn baz(self) {
+        unsafe { COUNT *= 5; }
+    }
+
+    fn qux(self: Box<Foo>) {
+        unsafe { COUNT *= 7; }
+    }
+}
+
+fn main() {
+    let x = Foo;
+    // Test external call.
+    Foo::bar(&x);
+    Foo::baz(x);
+    Foo::qux(box x);
+
+    x.foo(&x);
+
+    unsafe { assert!(COUNT == 2u*3*3*3*5*5*5*7*7*7); }
+}