Fix ICE of for-loop mut borrowck where no suggestions are available
This commit is contained in:
parent
5d04957a4b
commit
09d71448b7
@ -642,15 +642,18 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
|
|||||||
.starts_with(&original_method_ident.name.to_string())
|
.starts_with(&original_method_ident.name.to_string())
|
||||||
})
|
})
|
||||||
.map(|ident| format!("{}()", ident))
|
.map(|ident| format!("{}()", ident))
|
||||||
|
.peekable()
|
||||||
});
|
});
|
||||||
|
|
||||||
if let Some(suggestions) = opt_suggestions {
|
if let Some(mut suggestions) = opt_suggestions {
|
||||||
err.span_suggestions(
|
if suggestions.peek().is_some() {
|
||||||
path_segment.ident.span,
|
err.span_suggestions(
|
||||||
&format!("use mutable method"),
|
path_segment.ident.span,
|
||||||
suggestions,
|
&format!("use mutable method"),
|
||||||
Applicability::MaybeIncorrect,
|
suggestions,
|
||||||
);
|
Applicability::MaybeIncorrect,
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
32
src/test/ui/borrowck/issue-83309-ice-immut-in-for-loop.rs
Normal file
32
src/test/ui/borrowck/issue-83309-ice-immut-in-for-loop.rs
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
// rust-lang/rust#83309: The compiler tries to suggest potential
|
||||||
|
// methods that return `&mut` items. However, when it doesn't
|
||||||
|
// find such methods, it still tries to add suggestions
|
||||||
|
// which then fails an assertion later because there was
|
||||||
|
// no suggestions to make.
|
||||||
|
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
for v in Query.iter_mut() {
|
||||||
|
//~^ NOTE this iterator yields `&` references
|
||||||
|
*v -= 1;
|
||||||
|
//~^ ERROR cannot assign to `*v` which is behind a `&` reference
|
||||||
|
//~| NOTE `v` is a `&` reference, so the data it refers to cannot be written
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct Query;
|
||||||
|
pub struct QueryIter<'a>(&'a i32);
|
||||||
|
|
||||||
|
impl Query {
|
||||||
|
pub fn iter_mut<'a>(&'a mut self) -> QueryIter<'a> {
|
||||||
|
todo!();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> Iterator for QueryIter<'a> {
|
||||||
|
type Item = &'a i32;
|
||||||
|
|
||||||
|
fn next(&mut self) -> Option<Self::Item> {
|
||||||
|
todo!();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,12 @@
|
|||||||
|
error[E0594]: cannot assign to `*v` which is behind a `&` reference
|
||||||
|
--> $DIR/issue-83309-ice-immut-in-for-loop.rs:11:9
|
||||||
|
|
|
||||||
|
LL | for v in Query.iter_mut() {
|
||||||
|
| ---------------- this iterator yields `&` references
|
||||||
|
LL |
|
||||||
|
LL | *v -= 1;
|
||||||
|
| ^^^^^^^ `v` is a `&` reference, so the data it refers to cannot be written
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0594`.
|
Loading…
x
Reference in New Issue
Block a user