Rollup merge of #40841 - arielb1:immutable-blame, r=pnkfelix
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. Fixes #40859. cc @estebank r? @pnkfelix
This commit is contained in:
commit
a63b1dfa34
23 changed files with 428 additions and 226 deletions
|
|
@ -27,7 +27,7 @@ fn main() {
|
|||
x; //~ value moved here
|
||||
|
||||
let y = Int(2);
|
||||
//~^use `mut y` here to make mutable
|
||||
//~^ consider changing this to `mut y`
|
||||
y //~ error: cannot borrow immutable local variable `y` as mutable
|
||||
//~| cannot borrow
|
||||
+=
|
||||
|
|
|
|||
|
|
@ -23,7 +23,7 @@ fn indirect_write_to_imm_box() {
|
|||
let mut x: isize = 1;
|
||||
let y: Box<_> = box &mut x;
|
||||
let p = &y;
|
||||
***p = 2; //~ ERROR cannot assign to data in an immutable container
|
||||
***p = 2; //~ ERROR cannot assign to data in a `&` reference
|
||||
drop(p);
|
||||
}
|
||||
|
||||
|
|
@ -43,7 +43,6 @@ fn borrow_in_var_from_var_via_imm_box() {
|
|||
let p = &y;
|
||||
let q = &***p;
|
||||
**y = 2; //~ ERROR cannot assign to `**y` because it is borrowed
|
||||
//~^ ERROR cannot assign to data in an immutable container
|
||||
drop(p);
|
||||
drop(q);
|
||||
}
|
||||
|
|
@ -64,7 +63,6 @@ fn borrow_in_var_from_field_via_imm_box() {
|
|||
let p = &y;
|
||||
let q = &***p;
|
||||
**y = 2; //~ ERROR cannot assign to `**y` because it is borrowed
|
||||
//~^ ERROR cannot assign to data in an immutable container
|
||||
drop(p);
|
||||
drop(q);
|
||||
}
|
||||
|
|
@ -85,7 +83,6 @@ fn borrow_in_field_from_var_via_imm_box() {
|
|||
let p = &y.a;
|
||||
let q = &***p;
|
||||
**y.a = 2; //~ ERROR cannot assign to `**y.a` because it is borrowed
|
||||
//~^ ERROR cannot assign to data in an immutable container
|
||||
drop(p);
|
||||
drop(q);
|
||||
}
|
||||
|
|
@ -106,7 +103,6 @@ fn borrow_in_field_from_field_via_imm_box() {
|
|||
let p = &y.a;
|
||||
let q = &***p;
|
||||
**y.a = 2; //~ ERROR cannot assign to `**y.a` because it is borrowed
|
||||
//~^ ERROR cannot assign to data in an immutable container
|
||||
drop(p);
|
||||
drop(q);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@ fn main() {
|
|||
match op {
|
||||
Some(ref v) => { let a = &mut v; },
|
||||
//~^ ERROR:cannot borrow immutable
|
||||
//~| use `ref mut v` here to make mutable
|
||||
//~| cannot borrow mutably
|
||||
None => {},
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@ impl S {
|
|||
}
|
||||
|
||||
fn func(arg: S) {
|
||||
//~^ here to make mutable
|
||||
//~^ consider changing this to `mut arg`
|
||||
arg.mutate();
|
||||
//~^ ERROR cannot borrow immutable argument
|
||||
//~| cannot borrow mutably
|
||||
|
|
@ -25,7 +25,7 @@ fn func(arg: S) {
|
|||
|
||||
fn main() {
|
||||
let local = S;
|
||||
//~^ here to make mutable
|
||||
//~^ consider changing this to `mut local`
|
||||
local.mutate();
|
||||
//~^ ERROR cannot borrow immutable local variable
|
||||
//~| cannot borrow mutably
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
31
src/test/ui/did_you_mean/issue-35937.rs
Normal file
31
src/test/ui/did_you_mean/issue-35937.rs
Normal 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;
|
||||
}
|
||||
26
src/test/ui/did_you_mean/issue-35937.stderr
Normal file
26
src/test/ui/did_you_mean/issue-35937.stderr
Normal 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
|
||||
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -8,11 +8,11 @@
|
|||
// 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
|
||||
}
|
||||
|
||||
|
|
@ -20,3 +20,34 @@ fn main() {
|
|||
let z = Z { x: X::Y };
|
||||
let _ = &mut z.x;
|
||||
}
|
||||
|
||||
impl Z {
|
||||
fn foo<'z>(&'z self) {
|
||||
let _ = &mut self.x;
|
||||
}
|
||||
|
||||
fn foo1(&self, other: &Z) {
|
||||
let _ = &mut self.x;
|
||||
let _ = &mut other.x;
|
||||
}
|
||||
|
||||
fn foo2<'a>(&'a self, other: &Z) {
|
||||
let _ = &mut self.x;
|
||||
let _ = &mut other.x;
|
||||
}
|
||||
|
||||
fn foo3<'a>(self: &'a Self, other: &Z) {
|
||||
let _ = &mut self.x;
|
||||
let _ = &mut other.x;
|
||||
}
|
||||
|
||||
fn foo4(other: &Z) {
|
||||
let _ = &mut other.x;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
pub fn with_arg(z: Z, w: &Z) {
|
||||
let _ = &mut z.x;
|
||||
let _ = &mut w.x;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,5 +6,89 @@ 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 `self.x` as mutable
|
||||
--> $DIR/issue-39544.rs:26:22
|
||||
|
|
||||
25 | fn foo<'z>(&'z self) {
|
||||
| -------- use `&'z mut self` here to make mutable
|
||||
26 | let _ = &mut self.x;
|
||||
| ^^^^^^ cannot mutably borrow immutable field
|
||||
|
||||
error: cannot borrow immutable field `self.x` as mutable
|
||||
--> $DIR/issue-39544.rs:30:22
|
||||
|
|
||||
29 | fn foo1(&self, other: &Z) {
|
||||
| ----- use `&mut self` here to make mutable
|
||||
30 | let _ = &mut self.x;
|
||||
| ^^^^^^ cannot mutably borrow immutable field
|
||||
|
||||
error: cannot borrow immutable field `other.x` as mutable
|
||||
--> $DIR/issue-39544.rs:31:22
|
||||
|
|
||||
29 | fn foo1(&self, other: &Z) {
|
||||
| -- use `&mut Z` here to make mutable
|
||||
30 | let _ = &mut self.x;
|
||||
31 | let _ = &mut other.x;
|
||||
| ^^^^^^^ cannot mutably borrow immutable field
|
||||
|
||||
error: cannot borrow immutable field `self.x` as mutable
|
||||
--> $DIR/issue-39544.rs:35:22
|
||||
|
|
||||
34 | fn foo2<'a>(&'a self, other: &Z) {
|
||||
| -------- use `&'a mut self` here to make mutable
|
||||
35 | let _ = &mut self.x;
|
||||
| ^^^^^^ cannot mutably borrow immutable field
|
||||
|
||||
error: cannot borrow immutable field `other.x` as mutable
|
||||
--> $DIR/issue-39544.rs:36:22
|
||||
|
|
||||
34 | fn foo2<'a>(&'a self, other: &Z) {
|
||||
| -- use `&mut Z` here to make mutable
|
||||
35 | let _ = &mut self.x;
|
||||
36 | let _ = &mut other.x;
|
||||
| ^^^^^^^ cannot mutably borrow immutable field
|
||||
|
||||
error: cannot borrow immutable field `self.x` as mutable
|
||||
--> $DIR/issue-39544.rs:40:22
|
||||
|
|
||||
39 | fn foo3<'a>(self: &'a Self, other: &Z) {
|
||||
| -------- use `&'a mut Self` here to make mutable
|
||||
40 | let _ = &mut self.x;
|
||||
| ^^^^^^ cannot mutably borrow immutable field
|
||||
|
||||
error: cannot borrow immutable field `other.x` as mutable
|
||||
--> $DIR/issue-39544.rs:41:22
|
||||
|
|
||||
39 | fn foo3<'a>(self: &'a Self, other: &Z) {
|
||||
| -- use `&mut Z` here to make mutable
|
||||
40 | let _ = &mut self.x;
|
||||
41 | let _ = &mut other.x;
|
||||
| ^^^^^^^ cannot mutably borrow immutable field
|
||||
|
||||
error: cannot borrow immutable field `other.x` as mutable
|
||||
--> $DIR/issue-39544.rs:45:22
|
||||
|
|
||||
44 | fn foo4(other: &Z) {
|
||||
| -- use `&mut Z` here to make mutable
|
||||
45 | let _ = &mut other.x;
|
||||
| ^^^^^^^ cannot mutably borrow immutable field
|
||||
|
||||
error: cannot borrow immutable field `z.x` as mutable
|
||||
--> $DIR/issue-39544.rs:51:18
|
||||
|
|
||||
50 | pub fn with_arg(z: Z, w: &Z) {
|
||||
| - consider changing this to `mut z`
|
||||
51 | let _ = &mut z.x;
|
||||
| ^^^ cannot mutably borrow immutable field
|
||||
|
||||
error: cannot borrow immutable field `w.x` as mutable
|
||||
--> $DIR/issue-39544.rs:52:18
|
||||
|
|
||||
50 | pub fn with_arg(z: Z, w: &Z) {
|
||||
| -- use `&mut Z` here to make mutable
|
||||
51 | let _ = &mut z.x;
|
||||
52 | let _ = &mut w.x;
|
||||
| ^^^ cannot mutably borrow immutable field
|
||||
|
||||
error: aborting due to 11 previous errors
|
||||
|
||||
|
|
|
|||
14
src/test/ui/did_you_mean/issue-40823.rs
Normal file
14
src/test/ui/did_you_mean/issue-40823.rs
Normal 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();
|
||||
}
|
||||
8
src/test/ui/did_you_mean/issue-40823.stderr
Normal file
8
src/test/ui/did_you_mean/issue-40823.stderr
Normal 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
|
||||
|
||||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue