Rollup merge of #100186 - compiler-errors:or-as_mut, r=fee1-dead
Mention `as_mut` alongside `as_ref` in borrowck error message Kinda fixes #99426 but I guess that really might be better staying open to see if we could make it suggest `as_mut` in a structured way. Not sure how to change borrowck to know that info tho.
This commit is contained in:
commit
3cca14093a
@ -1086,14 +1086,6 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
|
||||
),
|
||||
);
|
||||
}
|
||||
if is_option_or_result && maybe_reinitialized_locations_is_empty {
|
||||
err.span_suggestion_verbose(
|
||||
fn_call_span.shrink_to_lo(),
|
||||
"consider calling `.as_ref()` to borrow the type's contents",
|
||||
"as_ref().",
|
||||
Applicability::MachineApplicable,
|
||||
);
|
||||
}
|
||||
// Avoid pointing to the same function in multiple different
|
||||
// error messages.
|
||||
if span != DUMMY_SP && self.fn_self_span_reported.insert(self_arg.span) {
|
||||
@ -1102,6 +1094,12 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
|
||||
&format!("this function takes ownership of the receiver `self`, which moves {}", place_name)
|
||||
);
|
||||
}
|
||||
if is_option_or_result && maybe_reinitialized_locations_is_empty {
|
||||
err.span_label(
|
||||
var_span,
|
||||
"help: consider calling `.as_ref()` or `.as_mut()` to borrow the type's contents",
|
||||
);
|
||||
}
|
||||
}
|
||||
// Other desugarings takes &self, which cannot cause a move
|
||||
_ => {}
|
||||
|
@ -5,6 +5,7 @@ LL | cb.map(|cb| cb());
|
||||
| ^^^--------------
|
||||
| | |
|
||||
| | `*cb` moved due to this method call
|
||||
| help: consider calling `.as_ref()` or `.as_mut()` to borrow the type's contents
|
||||
| move occurs because `*cb` has type `Option<&mut dyn FnMut()>`, which does not implement the `Copy` trait
|
||||
|
|
||||
note: this function takes ownership of the receiver `self`, which moves `*cb`
|
||||
@ -12,10 +13,6 @@ note: this function takes ownership of the receiver `self`, which moves `*cb`
|
||||
|
|
||||
LL | pub const fn map<U, F>(self, f: F) -> Option<U>
|
||||
| ^^^^
|
||||
help: consider calling `.as_ref()` to borrow the type's contents
|
||||
|
|
||||
LL | cb.as_ref().map(|cb| cb());
|
||||
| +++++++++
|
||||
|
||||
error[E0596]: cannot borrow `*cb` as mutable, as it is behind a `&` reference
|
||||
--> $DIR/suggest-as-ref-on-mut-closure.rs:12:26
|
||||
|
@ -1,13 +0,0 @@
|
||||
// run-rustfix
|
||||
|
||||
struct Struct;
|
||||
|
||||
fn bar(_: &Struct) -> Struct {
|
||||
Struct
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let foo = Some(Struct);
|
||||
let _x: Option<Struct> = foo.as_ref().map(|s| bar(&s));
|
||||
let _y = foo; //~ERROR use of moved value: `foo`
|
||||
}
|
@ -1,5 +1,3 @@
|
||||
// run-rustfix
|
||||
|
||||
struct Struct;
|
||||
|
||||
fn bar(_: &Struct) -> Struct {
|
||||
|
@ -1,10 +1,12 @@
|
||||
error[E0382]: use of moved value: `foo`
|
||||
--> $DIR/as-ref-2.rs:12:14
|
||||
--> $DIR/as-ref-2.rs:10:14
|
||||
|
|
||||
LL | let foo = Some(Struct);
|
||||
| --- move occurs because `foo` has type `Option<Struct>`, which does not implement the `Copy` trait
|
||||
LL | let _x: Option<Struct> = foo.map(|s| bar(&s));
|
||||
| ---------------- `foo` moved due to this method call
|
||||
| --- ---------------- `foo` moved due to this method call
|
||||
| |
|
||||
| help: consider calling `.as_ref()` or `.as_mut()` to borrow the type's contents
|
||||
LL | let _y = foo;
|
||||
| ^^^ value used here after move
|
||||
|
|
||||
@ -13,10 +15,6 @@ note: this function takes ownership of the receiver `self`, which moves `foo`
|
||||
|
|
||||
LL | pub const fn map<U, F>(self, f: F) -> Option<U>
|
||||
| ^^^^
|
||||
help: consider calling `.as_ref()` to borrow the type's contents
|
||||
|
|
||||
LL | let _x: Option<Struct> = foo.as_ref().map(|s| bar(&s));
|
||||
| +++++++++
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -1,39 +0,0 @@
|
||||
//run-rustfix
|
||||
|
||||
pub struct LipogramCorpora {
|
||||
selections: Vec<(char, Option<String>)>,
|
||||
}
|
||||
|
||||
impl LipogramCorpora {
|
||||
pub fn validate_all(&mut self) -> Result<(), char> {
|
||||
for selection in &self.selections {
|
||||
if selection.1.is_some() {
|
||||
if selection.1.as_ref().unwrap().contains(selection.0) {
|
||||
//~^ ERROR cannot move out of `selection.1`
|
||||
return Err(selection.0);
|
||||
}
|
||||
}
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
pub struct LipogramCorpora2 {
|
||||
selections: Vec<(char, Result<String, String>)>,
|
||||
}
|
||||
|
||||
impl LipogramCorpora2 {
|
||||
pub fn validate_all(&mut self) -> Result<(), char> {
|
||||
for selection in &self.selections {
|
||||
if selection.1.is_ok() {
|
||||
if selection.1.as_ref().unwrap().contains(selection.0) {
|
||||
//~^ ERROR cannot move out of `selection.1`
|
||||
return Err(selection.0);
|
||||
}
|
||||
}
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {}
|
@ -1,5 +1,3 @@
|
||||
//run-rustfix
|
||||
|
||||
pub struct LipogramCorpora {
|
||||
selections: Vec<(char, Option<String>)>,
|
||||
}
|
||||
|
@ -1,9 +1,10 @@
|
||||
error[E0507]: cannot move out of `selection.1` which is behind a shared reference
|
||||
--> $DIR/option-content-move.rs:11:20
|
||||
--> $DIR/option-content-move.rs:9:20
|
||||
|
|
||||
LL | if selection.1.unwrap().contains(selection.0) {
|
||||
| ^^^^^^^^^^^ -------- `selection.1` moved due to this method call
|
||||
| |
|
||||
| help: consider calling `.as_ref()` or `.as_mut()` to borrow the type's contents
|
||||
| move occurs because `selection.1` has type `Option<String>`, which does not implement the `Copy` trait
|
||||
|
|
||||
note: this function takes ownership of the receiver `self`, which moves `selection.1`
|
||||
@ -11,17 +12,14 @@ note: this function takes ownership of the receiver `self`, which moves `selecti
|
||||
|
|
||||
LL | pub const fn unwrap(self) -> T {
|
||||
| ^^^^
|
||||
help: consider calling `.as_ref()` to borrow the type's contents
|
||||
|
|
||||
LL | if selection.1.as_ref().unwrap().contains(selection.0) {
|
||||
| +++++++++
|
||||
|
||||
error[E0507]: cannot move out of `selection.1` which is behind a shared reference
|
||||
--> $DIR/option-content-move.rs:29:20
|
||||
--> $DIR/option-content-move.rs:27:20
|
||||
|
|
||||
LL | if selection.1.unwrap().contains(selection.0) {
|
||||
| ^^^^^^^^^^^ -------- `selection.1` moved due to this method call
|
||||
| |
|
||||
| help: consider calling `.as_ref()` or `.as_mut()` to borrow the type's contents
|
||||
| move occurs because `selection.1` has type `Result<String, String>`, which does not implement the `Copy` trait
|
||||
|
|
||||
note: this function takes ownership of the receiver `self`, which moves `selection.1`
|
||||
@ -29,10 +27,6 @@ note: this function takes ownership of the receiver `self`, which moves `selecti
|
||||
|
|
||||
LL | pub fn unwrap(self) -> T
|
||||
| ^^^^
|
||||
help: consider calling `.as_ref()` to borrow the type's contents
|
||||
|
|
||||
LL | if selection.1.as_ref().unwrap().contains(selection.0) {
|
||||
| +++++++++
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user