about summary refs log tree commit diff
path: root/tests/ui/borrowck/borrowck-uniq-via-lend.rs
diff options
context:
space:
mode:
Diffstat (limited to 'tests/ui/borrowck/borrowck-uniq-via-lend.rs')
-rw-r--r--tests/ui/borrowck/borrowck-uniq-via-lend.rs61
1 files changed, 61 insertions, 0 deletions
diff --git a/tests/ui/borrowck/borrowck-uniq-via-lend.rs b/tests/ui/borrowck/borrowck-uniq-via-lend.rs
new file mode 100644
index 00000000000..25d3e0b5486
--- /dev/null
+++ b/tests/ui/borrowck/borrowck-uniq-via-lend.rs
@@ -0,0 +1,61 @@
+fn borrow(_v: &isize) {}
+
+
+
+
+
+fn local() {
+    let mut v: Box<_> = Box::new(3);
+    borrow(&*v);
+}
+
+fn local_rec() {
+    struct F { f: Box<isize> }
+    let mut v = F {f: Box::new(3)};
+    borrow(&*v.f);
+}
+
+fn local_recs() {
+    struct F { f: G }
+    struct G { g: H }
+    struct H { h: Box<isize> }
+    let mut v = F {f: G {g: H {h: Box::new(3)}}};
+    borrow(&*v.f.g.h);
+}
+
+fn aliased_imm() {
+    let mut v: Box<_> = Box::new(3);
+    let w = &v;
+    borrow(&*v);
+    w.use_ref();
+}
+
+fn aliased_mut() {
+    let mut v: Box<_> = Box::new(3);
+    let w = &mut v;
+    borrow(&*v); //~ ERROR cannot borrow `*v`
+    w.use_mut();
+}
+
+fn aliased_other() {
+    let mut v: Box<_> = Box::new(3);
+    let mut w: Box<_> = Box::new(4);
+    let x = &mut w;
+    borrow(&*v);
+    x.use_mut();
+}
+
+fn aliased_other_reassign() {
+    let mut v: Box<_> = Box::new(3);
+    let mut w: Box<_> = Box::new(4);
+    let mut x = &mut w;
+    x = &mut v;
+    borrow(&*v); //~ ERROR cannot borrow `*v`
+    x.use_mut();
+}
+
+fn main() {
+}
+
+trait Fake { fn use_mut(&mut self) { } fn use_ref(&self) { }  }
+impl<T> Fake for T { }