borrowck: consolidate mut suggestions

This converts all of borrowck's `mut` suggestions to a new
`mc::ImmutabilityBlame` API instead of the current mix of various hacks.

Fixes #35937.
Fixes #40823.
This commit is contained in:
Ariel Ben-Yehuda 2017-03-26 19:35:46 +03:00
parent 49c67bd632
commit 50728e5245
21 changed files with 305 additions and 208 deletions

View file

@ -2,7 +2,7 @@ error: cannot borrow immutable local variable `x` as mutable
--> $DIR/huge_multispan_highlight.rs:100:18
|
12 | let x = "foo";
| - use `mut x` here to make mutable
| - consider changing this to `mut x`
...
100 | let y = &mut x;
| ^ cannot borrow mutably

View file

@ -10,6 +10,8 @@ error: cannot borrow immutable argument `self` as mutable
error: cannot borrow immutable argument `self` as mutable
--> $DIR/issue-31424.rs:23:15
|
22 | fn bar(self: &mut Self) {
| ---- consider changing this to `mut self`
23 | (&mut self).bar();
| ^^^^ cannot borrow mutably

View file

@ -0,0 +1,31 @@
// Copyright 2017 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 {
pub v: Vec<String>
}
fn main() {
let f = Foo { v: Vec::new() };
f.v.push("cat".to_string());
}
struct S {
x: i32,
}
fn foo() {
let s = S { x: 42 };
s.x += 1;
}
fn bar(s: S) {
s.x += 1;
}

View file

@ -0,0 +1,26 @@
error: cannot borrow immutable field `f.v` as mutable
--> $DIR/issue-35937.rs:17:5
|
16 | let f = Foo { v: Vec::new() };
| - consider changing this to `mut f`
17 | f.v.push("cat".to_string());
| ^^^ cannot mutably borrow immutable field
error: cannot assign to immutable field `s.x`
--> $DIR/issue-35937.rs:26:5
|
25 | let s = S { x: 42 };
| - consider changing this to `mut s`
26 | s.x += 1;
| ^^^^^^^^ cannot mutably borrow immutable field
error: cannot assign to immutable field `s.x`
--> $DIR/issue-35937.rs:30:5
|
29 | fn bar(s: S) {
| - consider changing this to `mut s`
30 | s.x += 1;
| ^^^^^^^^ cannot mutably borrow immutable field
error: aborting due to 3 previous errors

View file

@ -2,7 +2,7 @@ error: cannot borrow immutable borrowed content `*self.s` as mutable
--> $DIR/issue-38147-2.rs:17:9
|
12 | s: &'a String
| ------------- use `&'a mut String` here to make mutable
| ---------- use `&'a mut String` here to make mutable
...
17 | self.s.push('x');
| ^^^^^^ cannot borrow as mutable

View file

@ -2,10 +2,8 @@ error: cannot borrow immutable borrowed content `*self.s` as mutable
--> $DIR/issue-38147-3.rs:17:9
|
12 | s: &'a String
| ------------- use `&'a mut String` here to make mutable
| ---------- use `&'a mut String` here to make mutable
...
16 | fn f(&self) {
| ----- use `&mut self` here to make mutable
17 | self.s.push('x');
| ^^^^^^ cannot borrow as mutable

View file

@ -8,15 +8,20 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.
enum X {
pub enum X {
Y
}
struct Z {
pub struct Z {
x: X
}
fn main() {
pub fn main() {
let z = Z { x: X::Y };
let _ = &mut z.x;
}
pub fn with_arg(z: Z, w: &Z) {
let _ = &mut z.x;
let _ = &mut w.x;
}

View file

@ -6,5 +6,22 @@ error: cannot borrow immutable field `z.x` as mutable
21 | let _ = &mut z.x;
| ^^^ cannot mutably borrow immutable field
error: aborting due to previous error
error: cannot borrow immutable field `z.x` as mutable
--> $DIR/issue-39544.rs:25:18
|
24 | pub fn with_arg(z: Z, w: &Z) {
| - consider changing this to `mut z`
25 | let _ = &mut z.x;
| ^^^ cannot mutably borrow immutable field
error: cannot borrow immutable field `w.x` as mutable
--> $DIR/issue-39544.rs:26:18
|
24 | pub fn with_arg(z: Z, w: &Z) {
| -- use `&mut Z` here to make mutable
25 | let _ = &mut z.x;
26 | let _ = &mut w.x;
| ^^^ cannot mutably borrow immutable field
error: aborting due to 3 previous errors

View file

@ -0,0 +1,14 @@
// Copyright 2017 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.
fn main() {
let mut buf = &[1, 2, 3, 4];
buf.iter_mut();
}

View file

@ -0,0 +1,8 @@
error: cannot borrow immutable borrowed content `*buf` as mutable
--> $DIR/issue-40823.rs:13:5
|
13 | buf.iter_mut();
| ^^^ cannot borrow as mutable
error: aborting due to previous error

View file

@ -2,7 +2,7 @@ error: cannot borrow immutable argument `x` as mutable
--> $DIR/borrowck-borrow-overloaded-auto-deref-mut.rs:63:24
|
62 | fn deref_mut_field1(x: Own<Point>) {
| - use `mut x` here to make mutable
| - consider changing this to `mut x`
63 | let __isize = &mut x.y; //~ ERROR cannot borrow
| ^ cannot borrow mutably
@ -28,7 +28,7 @@ error: cannot borrow immutable argument `x` as mutable
--> $DIR/borrowck-borrow-overloaded-auto-deref-mut.rs:98:5
|
97 | fn assign_field1<'a>(x: Own<Point>) {
| - use `mut x` here to make mutable
| - consider changing this to `mut x`
98 | x.y = 3; //~ ERROR cannot borrow
| ^ cannot borrow mutably
@ -54,7 +54,7 @@ error: cannot borrow immutable argument `x` as mutable
--> $DIR/borrowck-borrow-overloaded-auto-deref-mut.rs:119:5
|
118 | fn deref_mut_method1(x: Own<Point>) {
| - use `mut x` here to make mutable
| - consider changing this to `mut x`
119 | x.set(0, 0); //~ ERROR cannot borrow
| ^ cannot borrow mutably
@ -70,7 +70,7 @@ error: cannot borrow immutable argument `x` as mutable
--> $DIR/borrowck-borrow-overloaded-auto-deref-mut.rs:139:6
|
138 | fn assign_method1<'a>(x: Own<Point>) {
| - use `mut x` here to make mutable
| - consider changing this to `mut x`
139 | *x.y_mut() = 3; //~ ERROR cannot borrow
| ^ cannot borrow mutably

View file

@ -2,7 +2,7 @@ error: cannot borrow immutable argument `x` as mutable
--> $DIR/borrowck-borrow-overloaded-deref-mut.rs:39:25
|
38 | fn deref_mut1(x: Own<isize>) {
| - use `mut x` here to make mutable
| - consider changing this to `mut x`
39 | let __isize = &mut *x; //~ ERROR cannot borrow
| ^ cannot borrow mutably
@ -18,7 +18,7 @@ error: cannot borrow immutable argument `x` as mutable
--> $DIR/borrowck-borrow-overloaded-deref-mut.rs:59:6
|
58 | fn assign1<'a>(x: Own<isize>) {
| - use `mut x` here to make mutable
| - consider changing this to `mut x`
59 | *x = 3; //~ ERROR cannot borrow
| ^ cannot borrow mutably

View file

@ -10,6 +10,9 @@ error: cannot borrow immutable borrowed content `*x` as mutable
error: cannot borrow immutable `Box` content `*x` as mutable
--> $DIR/borrowck-object-mutability.rs:29:5
|
27 | fn owned_receiver(x: Box<Foo>) {
| - consider changing this to `mut x`
28 | x.borrowed();
29 | x.borrowed_mut(); //~ ERROR cannot borrow
| ^ cannot borrow as mutable