diff options
| author | Patrick Walton <pcwalton@mimiga.net> | 2014-07-03 14:32:41 -0700 |
|---|---|---|
| committer | Patrick Walton <pcwalton@mimiga.net> | 2014-07-07 11:43:23 -0700 |
| commit | 7e4e99123a68c92f684e5c4466101c1951e86895 (patch) | |
| tree | 270c38b9308597595fc05b233e25ef8252628439 /src/test/compile-fail | |
| parent | 4f120e6bafe971452adfede158a7957b00562a4e (diff) | |
| download | rust-7e4e99123a68c92f684e5c4466101c1951e86895.tar.gz rust-7e4e99123a68c92f684e5c4466101c1951e86895.zip | |
librustc (RFC #34): Implement the new `Index` and `IndexMut` traits.
This will break code that used the old `Index` trait. Change this code
to use the new `Index` traits. For reference, here are their signatures:
pub trait Index<Index,Result> {
fn index<'a>(&'a self, index: &Index) -> &'a Result;
}
pub trait IndexMut<Index,Result> {
fn index_mut<'a>(&'a mut self, index: &Index) -> &'a mut Result;
}
Closes #6515.
[breaking-change]
Diffstat (limited to 'src/test/compile-fail')
| -rw-r--r-- | src/test/compile-fail/borrowck-overloaded-index.rs | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/src/test/compile-fail/borrowck-overloaded-index.rs b/src/test/compile-fail/borrowck-overloaded-index.rs new file mode 100644 index 00000000000..d34aa1cd9cb --- /dev/null +++ b/src/test/compile-fail/borrowck-overloaded-index.rs @@ -0,0 +1,64 @@ +// 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. + +struct Foo { + x: int, + y: int, +} + +impl Index<String,int> for Foo { + fn index<'a>(&'a self, z: &String) -> &'a int { + if z.as_slice() == "x" { + &self.x + } else { + &self.y + } + } +} + +impl IndexMut<String,int> for Foo { + fn index_mut<'a>(&'a mut self, z: &String) -> &'a mut int { + if z.as_slice() == "x" { + &mut self.x + } else { + &mut self.y + } + } +} + +struct Bar { + x: int, +} + +impl Index<int,int> for Bar { + fn index<'a>(&'a self, z: &int) -> &'a int { + &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 borrow `s` as immutable because it is also borrowed as mutable + f[s] = 10; + //~^ ERROR cannot borrow `s` as immutable because it is also borrowed as mutable + let s = Bar { + x: 1, + }; + s[2] = 20; + //~^ ERROR cannot assign to immutable indexed content +} + + |
