Skip to content

Commit

Permalink
Drop tracking: handle invalid assignments better
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
eholk committed May 13, 2022
1 parent d4c3643 commit 5c98737
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
14 changes: 14 additions & 0 deletions src/test/ui/async-await/issue-73741-type-err-drop-tracking.rs
Original file line number Diff line number Diff line change
@@ -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() {}
11 changes: 11 additions & 0 deletions src/test/ui/async-await/issue-73741-type-err-drop-tracking.stderr
Original file line number Diff line number Diff line change
@@ -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`.

0 comments on commit 5c98737

Please sign in to comment.