From 7e4e99123a68c92f684e5c4466101c1951e86895 Mon Sep 17 00:00:00 2001 From: Patrick Walton Date: Thu, 3 Jul 2014 14:32:41 -0700 Subject: 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 { fn index<'a>(&'a self, index: &Index) -> &'a Result; } pub trait IndexMut { fn index_mut<'a>(&'a mut self, index: &Index) -> &'a mut Result; } Closes #6515. [breaking-change] --- src/test/auxiliary/issue2378a.rs | 22 -------- src/test/auxiliary/issue2378b.rs | 23 -------- src/test/compile-fail/borrowck-overloaded-index.rs | 64 ++++++++++++++++++++++ src/test/run-pass/issue-11736.rs | 4 +- src/test/run-pass/issue2378c.rs | 23 -------- src/test/run-pass/operator-overloading.rs | 8 ++- src/test/run-pass/overload-index-operator.rs | 4 +- src/test/run-pass/overloaded-index.rs | 53 ++++++++++++++++++ 8 files changed, 127 insertions(+), 74 deletions(-) delete mode 100644 src/test/auxiliary/issue2378a.rs delete mode 100644 src/test/auxiliary/issue2378b.rs create mode 100644 src/test/compile-fail/borrowck-overloaded-index.rs delete mode 100644 src/test/run-pass/issue2378c.rs create mode 100644 src/test/run-pass/overloaded-index.rs (limited to 'src/test') diff --git a/src/test/auxiliary/issue2378a.rs b/src/test/auxiliary/issue2378a.rs deleted file mode 100644 index 934c4f52af0..00000000000 --- a/src/test/auxiliary/issue2378a.rs +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright 2012 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. - -#![crate_type = "lib"] - -pub enum maybe { just(T), nothing } - -impl Index for maybe { - fn index(&self, _idx: &uint) -> T { - match self { - &just(ref t) => (*t).clone(), - ¬hing => { fail!(); } - } - } -} diff --git a/src/test/auxiliary/issue2378b.rs b/src/test/auxiliary/issue2378b.rs deleted file mode 100644 index 03f685c949a..00000000000 --- a/src/test/auxiliary/issue2378b.rs +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2012 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. - -#![crate_type = "lib"] - -extern crate issue2378a; - -use issue2378a::maybe; - -pub struct two_maybes {pub a: maybe, pub b: maybe} - -impl Index for two_maybes { - fn index(&self, idx: &uint) -> (T, T) { - (self.a[*idx], self.b[*idx]) - } -} 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 or the MIT license +// , 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 for Foo { + fn index<'a>(&'a self, z: &String) -> &'a int { + if z.as_slice() == "x" { + &self.x + } else { + &self.y + } + } +} + +impl IndexMut 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 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 +} + + diff --git a/src/test/run-pass/issue-11736.rs b/src/test/run-pass/issue-11736.rs index 255807b4c0e..10d6e0158f6 100644 --- a/src/test/run-pass/issue-11736.rs +++ b/src/test/run-pass/issue-11736.rs @@ -16,13 +16,13 @@ use std::collections::Bitv; fn main() { // Generate sieve of Eratosthenes for n up to 1e6 let n = 1000000u; - let sieve = Bitv::with_capacity(n+1, true); + let mut sieve = Bitv::with_capacity(n+1, true); let limit: uint = (n as f32).sqrt() as uint; for i in range(2, limit+1) { if sieve[i] { let mut j = 0; while i*i + j*i <= n { - sieve[i*i+j*i] = false; + sieve.set(i*i+j*i, false); j += 1; } } diff --git a/src/test/run-pass/issue2378c.rs b/src/test/run-pass/issue2378c.rs deleted file mode 100644 index c453a538c7e..00000000000 --- a/src/test/run-pass/issue2378c.rs +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2012-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. - -// aux-build:issue2378a.rs -// aux-build:issue2378b.rs - -extern crate issue2378a; -extern crate issue2378b; - -use issue2378a::{just}; -use issue2378b::{two_maybes}; - -pub fn main() { - let x = two_maybes{a: just(3i), b: just(5i)}; - assert_eq!(x[0u], (3, 5)); -} diff --git a/src/test/run-pass/operator-overloading.rs b/src/test/run-pass/operator-overloading.rs index 00e19b8481f..a36d8132b26 100644 --- a/src/test/run-pass/operator-overloading.rs +++ b/src/test/run-pass/operator-overloading.rs @@ -43,8 +43,12 @@ impl ops::Not for Point { } impl ops::Index for Point { - fn index(&self, x: &bool) -> int { - if *x { self.x } else { self.y } + fn index<'a>(&'a self, x: &bool) -> &'a int { + if *x { + &self.x + } else { + &self.y + } } } diff --git a/src/test/run-pass/overload-index-operator.rs b/src/test/run-pass/overload-index-operator.rs index de5456ef1c0..6b1ac0b821c 100644 --- a/src/test/run-pass/overload-index-operator.rs +++ b/src/test/run-pass/overload-index-operator.rs @@ -31,10 +31,10 @@ impl AssociationList { } impl Index for AssociationList { - fn index(&self, index: &K) -> V { + fn index<'a>(&'a self, index: &K) -> &'a V { for pair in self.pairs.iter() { if pair.key == *index { - return pair.value.clone(); + return &pair.value } } fail!("No value found for key: {:?}", index); diff --git a/src/test/run-pass/overloaded-index.rs b/src/test/run-pass/overloaded-index.rs new file mode 100644 index 00000000000..9d7c068cccd --- /dev/null +++ b/src/test/run-pass/overloaded-index.rs @@ -0,0 +1,53 @@ +// 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. + +struct Foo { + x: int, + y: int, +} + +impl Index for Foo { + fn index<'a>(&'a self, z: &int) -> &'a int { + if *z == 0 { + &self.x + } else { + &self.y + } + } +} + +impl IndexMut for Foo { + fn index_mut<'a>(&'a mut self, z: &int) -> &'a mut int { + if *z == 0 { + &mut self.x + } else { + &mut self.y + } + } +} + +fn main() { + let mut f = Foo { + x: 1, + y: 2, + }; + assert_eq!(f[1], 2); + f[0] = 3; + assert_eq!(f[0], 3); + { + let p = &mut f[1]; + *p = 4; + } + { + let p = &f[1]; + assert_eq!(*p, 4); + } +} + -- cgit 1.4.1-3-g733a5