diff --git a/src/librustc/diagnostics.rs b/src/librustc/diagnostics.rs index 38df0284371d0..eb504d03209f6 100644 --- a/src/librustc/diagnostics.rs +++ b/src/librustc/diagnostics.rs @@ -1205,8 +1205,8 @@ register_diagnostics! { E0017, E0022, E0038, - E0134, - E0135, +// E0134, +// E0135, E0136, E0138, E0139, diff --git a/src/librustc/middle/effect.rs b/src/librustc/middle/effect.rs index 8084c2b0c39b8..1ee557eb8cce3 100644 --- a/src/librustc/middle/effect.rs +++ b/src/librustc/middle/effect.rs @@ -59,26 +59,6 @@ impl<'a, 'tcx> EffectCheckVisitor<'a, 'tcx> { UnsafeFn => {} } } - - fn check_str_index(&mut self, e: &ast::Expr) { - let base_type = match e.node { - ast::ExprIndex(ref base, _) => self.tcx.node_id_to_type(base.id), - _ => return - }; - debug!("effect: checking index with base type {:?}", - base_type); - match base_type.sty { - ty::TyBox(ty) | ty::TyRef(_, ty::mt{ty, ..}) => if ty::TyStr == ty.sty { - span_err!(self.tcx.sess, e.span, E0134, - "modification of string types is not allowed"); - }, - ty::TyStr => { - span_err!(self.tcx.sess, e.span, E0135, - "modification of string types is not allowed"); - } - _ => {} - } - } } impl<'a, 'tcx, 'v> Visitor<'v> for EffectCheckVisitor<'a, 'tcx> { @@ -164,12 +144,6 @@ impl<'a, 'tcx, 'v> Visitor<'v> for EffectCheckVisitor<'a, 'tcx> { self.require_unsafe(expr.span, "dereference of raw pointer") } } - ast::ExprAssign(ref base, _) | ast::ExprAssignOp(_, ref base, _) => { - self.check_str_index(&**base); - } - ast::ExprAddrOf(ast::MutMutable, ref base) => { - self.check_str_index(&**base); - } ast::ExprInlineAsm(..) => { self.require_unsafe(expr.span, "use of inline assembly"); } diff --git a/src/test/compile-fail/str-mut-idx-2.rs b/src/test/compile-fail/str-mut-idx-2.rs new file mode 100644 index 0000000000000..aa05d7d5c54d7 --- /dev/null +++ b/src/test/compile-fail/str-mut-idx-2.rs @@ -0,0 +1,16 @@ +// Copyright 2015 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. + +fn mutate(mut s: &mut str) { + let _s: &mut str = &mut s[1..2]; + //~^ ERROR cannot borrow immutable indexed content as mutable +} + +pub fn main() {} diff --git a/src/test/compile-fail/str-mut-idx.rs b/src/test/compile-fail/str-mut-idx.rs new file mode 100644 index 0000000000000..88e90c8244d87 --- /dev/null +++ b/src/test/compile-fail/str-mut-idx.rs @@ -0,0 +1,22 @@ +// Copyright 2015 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. + +fn bot() -> T { loop {} } + +fn mutate(s: &mut str) { + s[1..2] = bot(); + //~^ ERROR `core::marker::Sized` is not implemented for the type `str` + //~^^ ERROR `core::marker::Sized` is not implemented for the type `str` + s[1usize] = bot(); + //~^ ERROR `core::ops::Index` is not implemented for the type `str` + //~^^ ERROR `core::ops::Index` is not implemented for the type `str` +} + +pub fn main() {}