From b760c56f4551872f20b355bec12cb63018381419 Mon Sep 17 00:00:00 2001 From: Niko Matsakis Date: Sat, 21 Mar 2015 21:16:57 -0400 Subject: [PATCH] Update borrowck tests to test that index is by-move now --- ...orrowck-overloaded-index-move-from-vec.rs} | 2 +- .../borrowck-overloaded-index-move-index.rs | 74 +++++++++++++++++++ ...=> borrowck-overloaded-index-ref-index.rs} | 14 ++-- 3 files changed, 82 insertions(+), 8 deletions(-) rename src/test/compile-fail/{borrowck-overloaded-index-2.rs => borrowck-overloaded-index-move-from-vec.rs} (95%) create mode 100644 src/test/compile-fail/borrowck-overloaded-index-move-index.rs rename src/test/compile-fail/{borrowck-overloaded-index.rs => borrowck-overloaded-index-ref-index.rs} (82%) diff --git a/src/test/compile-fail/borrowck-overloaded-index-2.rs b/src/test/compile-fail/borrowck-overloaded-index-move-from-vec.rs similarity index 95% rename from src/test/compile-fail/borrowck-overloaded-index-2.rs rename to src/test/compile-fail/borrowck-overloaded-index-move-from-vec.rs index 58668b73cbffb..1b62d9c326d77 100644 --- a/src/test/compile-fail/borrowck-overloaded-index-2.rs +++ b/src/test/compile-fail/borrowck-overloaded-index-move-from-vec.rs @@ -19,7 +19,7 @@ struct MyVec { impl Index for MyVec { type Output = T; - fn index(&self, &i: &usize) -> &T { + fn index(&self, i: usize) -> &T { &self.data[i] } } diff --git a/src/test/compile-fail/borrowck-overloaded-index-move-index.rs b/src/test/compile-fail/borrowck-overloaded-index-move-index.rs new file mode 100644 index 0000000000000..d8615d1905338 --- /dev/null +++ b/src/test/compile-fail/borrowck-overloaded-index-move-index.rs @@ -0,0 +1,74 @@ +// 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 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +use std::ops::{Index, IndexMut}; + +struct Foo { + x: isize, + y: isize, +} + +impl Index for Foo { + type Output = isize; + + fn index(&self, z: String) -> &isize { + if z == "x" { + &self.x + } else { + &self.y + } + } +} + +impl IndexMut for Foo { + fn index_mut(&mut self, z: String) -> &mut isize { + if z == "x" { + &mut self.x + } else { + &mut self.y + } + } +} + +struct Bar { + x: isize, +} + +impl Index for Bar { + type Output = isize; + + fn index<'a>(&'a self, z: isize) -> &'a isize { + &self.x + } +} + +fn main() { + let mut f = Foo { + x: 1, + y: 2, + }; + let mut s = "hello".to_string(); + let rs = &mut s; + + println!("{}", f[s]); + //~^ ERROR cannot move out of `s` because it is borrowed + + f[s] = 10; + //~^ ERROR cannot move out of `s` because it is borrowed + //~| ERROR use of moved value: `s` + + let s = Bar { + x: 1, + }; + let i = 2; + let _j = &i; + println!("{}", s[i]); // no error, i is copy + println!("{}", s[i]); +} diff --git a/src/test/compile-fail/borrowck-overloaded-index.rs b/src/test/compile-fail/borrowck-overloaded-index-ref-index.rs similarity index 82% rename from src/test/compile-fail/borrowck-overloaded-index.rs rename to src/test/compile-fail/borrowck-overloaded-index-ref-index.rs index 2d752abe7e3c2..4c50caf49768d 100644 --- a/src/test/compile-fail/borrowck-overloaded-index.rs +++ b/src/test/compile-fail/borrowck-overloaded-index-ref-index.rs @@ -15,10 +15,10 @@ struct Foo { y: isize, } -impl Index for Foo { +impl<'a> Index<&'a String> for Foo { type Output = isize; - fn index<'a>(&'a self, z: &String) -> &'a isize { + fn index(&self, z: &String) -> &isize { if *z == "x" { &self.x } else { @@ -27,8 +27,8 @@ impl Index for Foo { } } -impl IndexMut for Foo { - fn index_mut<'a>(&'a mut self, z: &String) -> &'a mut isize { +impl<'a> IndexMut<&'a String> for Foo { + fn index_mut(&mut self, z: &String) -> &mut isize { if *z == "x" { &mut self.x } else { @@ -44,7 +44,7 @@ struct Bar { impl Index for Bar { type Output = isize; - fn index<'a>(&'a self, z: &isize) -> &'a isize { + fn index<'a>(&'a self, z: isize) -> &'a isize { &self.x } } @@ -56,9 +56,9 @@ fn main() { }; let mut s = "hello".to_string(); let rs = &mut s; - println!("{}", f[s]); + println!("{}", f[&s]); //~^ ERROR cannot borrow `s` as immutable because it is also borrowed as mutable - f[s] = 10; + f[&s] = 10; //~^ ERROR cannot borrow `s` as immutable because it is also borrowed as mutable let s = Bar { x: 1,