mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-24 15:54:15 +00:00
Drop tracking: handle invalid assignments better
Previously this test case was crashing with an index out of bounds error deep in the call to `needs_drop`. We avoid this by detecting clearly invalid assignees in the `mutate` callback and ignoring these.
This commit is contained in:
parent
d4c364347c
commit
5c98737715
@ -180,6 +180,15 @@ impl<'tcx> expr_use_visitor::Delegate<'tcx> for ExprUseDelegate<'tcx> {
|
||||
diag_expr_id: HirId,
|
||||
) {
|
||||
debug!("mutate {assignee_place:?}; diag_expr_id={diag_expr_id:?}");
|
||||
|
||||
if assignee_place.place.base == PlaceBase::Rvalue
|
||||
&& assignee_place.place.projections.len() == 0
|
||||
{
|
||||
// Assigning to an Rvalue is illegal unless done through a dereference. We would have
|
||||
// already gotten a type error, so we will just return here.
|
||||
return;
|
||||
}
|
||||
|
||||
// If the type being assigned needs dropped, then the mutation counts as a borrow
|
||||
// since it is essentially doing `Drop::drop(&mut x); x = new_value;`.
|
||||
if assignee_place.place.base_ty.needs_drop(self.tcx, self.param_env) {
|
||||
|
@ -0,0 +1,14 @@
|
||||
// edition:2018
|
||||
// compile-flags: -Zdrop-tracking
|
||||
// Regression test for issue #73741
|
||||
// Ensures that we don't emit spurious errors when
|
||||
// a type error ocurrs in an `async fn`
|
||||
|
||||
async fn weird() {
|
||||
1 = 2; //~ ERROR invalid left-hand side
|
||||
|
||||
let mut loop_count = 0;
|
||||
async {}.await
|
||||
}
|
||||
|
||||
fn main() {}
|
@ -0,0 +1,11 @@
|
||||
error[E0070]: invalid left-hand side of assignment
|
||||
--> $DIR/issue-73741-type-err-drop-tracking.rs:8:7
|
||||
|
|
||||
LL | 1 = 2;
|
||||
| - ^
|
||||
| |
|
||||
| cannot assign to this expression
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0070`.
|
Loading…
Reference in New Issue
Block a user