// 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. // Test that we still see borrowck errors of various kinds when using // indexing and autoderef in combination. use std::ops::{Index, IndexMut}; struct Foo { x: int, y: int, } impl Index for Foo { type Output = int; fn index<'a>(&'a self, z: &String) -> &'a int { if z.as_slice() == "x" { &self.x } else { &self.y } } } impl IndexMut for Foo { type Output = int; fn index_mut<'a>(&'a mut self, z: &String) -> &'a mut int { if z.as_slice() == "x" { &mut self.x } else { &mut self.y } } } fn test1(mut f: Box, s: String) { let _p = &mut f[s]; let _q = &f[s]; //~ ERROR cannot borrow } fn test2(mut f: Box, s: String) { let _p = &mut f[s]; let _q = &mut f[s]; //~ ERROR cannot borrow } struct Bar { foo: Foo } fn test3(mut f: Box, s: String) { let _p = &mut f.foo[s]; let _q = &mut f.foo[s]; //~ ERROR cannot borrow } fn test4(mut f: Box, s: String) { let _p = &f.foo[s]; let _q = &f.foo[s]; } fn test5(mut f: Box, s: String) { let _p = &f.foo[s]; let _q = &mut f.foo[s]; //~ ERROR cannot borrow } fn test6(mut f: Box, g: Foo, s: String) { let _p = &f.foo[s]; f.foo = g; //~ ERROR cannot assign } fn test7(mut f: Box, g: Bar, s: String) { let _p = &f.foo[s]; *f = g; //~ ERROR cannot assign } fn test8(mut f: Box, g: Foo, s: String) { let _p = &mut f.foo[s]; f.foo = g; //~ ERROR cannot assign } fn test9(mut f: Box, g: Bar, s: String) { let _p = &mut f.foo[s]; *f = g; //~ ERROR cannot assign } fn main() { }