Rollup merge of #101217 - eholk:drop-tracking-73137, r=jyn514
[drop tracking] Use parent expression for scope, not parent node
Previously we were just using the parent node as the scope for a temporary value, but it turns out this is too narrow. For example, in an expression like
Foo {
b: &42,
a: async { 0 }.await,
}
the scope for the &42 was set to the ExprField node for `b: &42`, when we actually want to use the Foo struct expression.
We fix this by recursively searching through parent nodes until we find a Node::Expr. It may be that we don't find one, and if so that's okay, we will just fall back on the enclosing temporary scope which is always sufficient.
Helps with #97331
r? ``@jyn514``
This commit is contained in:
commit
dc8fe633d5
4 changed files with 17 additions and 4 deletions
|
|
@ -291,6 +291,9 @@ impl<'hir> Map<'hir> {
|
|||
Some(def_kind)
|
||||
}
|
||||
|
||||
/// Finds the id of the parent node to this one.
|
||||
///
|
||||
/// If calling repeatedly and iterating over parents, prefer [`Map::parent_iter`].
|
||||
pub fn find_parent_node(self, id: HirId) -> Option<HirId> {
|
||||
if id.local_id == ItemLocalId::from_u32(0) {
|
||||
Some(self.tcx.hir_owner_parent(id.owner))
|
||||
|
|
|
|||
|
|
@ -408,8 +408,15 @@ impl<'a, 'tcx> Visitor<'tcx> for InteriorVisitor<'a, 'tcx> {
|
|||
}) {
|
||||
self.rvalue_scopes.temporary_scope(self.region_scope_tree, expr.hir_id.local_id)
|
||||
} else {
|
||||
debug!("parent_node: {:?}", self.fcx.tcx.hir().find_parent_node(expr.hir_id));
|
||||
match self.fcx.tcx.hir().find_parent_node(expr.hir_id) {
|
||||
let parent_expr = self
|
||||
.fcx
|
||||
.tcx
|
||||
.hir()
|
||||
.parent_iter(expr.hir_id)
|
||||
.find(|(_, node)| matches!(node, hir::Node::Expr(_)))
|
||||
.map(|(id, _)| id);
|
||||
debug!("parent_expr: {:?}", parent_expr);
|
||||
match parent_expr {
|
||||
Some(parent) => Some(Scope { id: parent.local_id, data: ScopeData::Node }),
|
||||
None => {
|
||||
self.rvalue_scopes.temporary_scope(self.region_scope_tree, expr.hir_id.local_id)
|
||||
|
|
|
|||
|
|
@ -159,8 +159,8 @@ impl<'tcx> expr_use_visitor::Delegate<'tcx> for ExprUseDelegate<'tcx> {
|
|||
bk: rustc_middle::ty::BorrowKind,
|
||||
) {
|
||||
debug!(
|
||||
"borrow: place_with_id = {place_with_id:?}, diag_expr_id={diag_expr_id:?}, \
|
||||
borrow_kind={bk:?}"
|
||||
"borrow: place_with_id = {place_with_id:#?}, diag_expr_id={diag_expr_id:#?}, \
|
||||
borrow_kind={bk:#?}"
|
||||
);
|
||||
|
||||
self.borrow_place(place_with_id);
|
||||
|
|
|
|||
|
|
@ -2,6 +2,9 @@
|
|||
|
||||
// run-pass
|
||||
// edition:2018
|
||||
// revisions: normal drop-tracking
|
||||
// [normal]compile-flags: -Zdrop-tracking=no
|
||||
// [drop-tracking]compile-flags: -Zdrop-tracking
|
||||
|
||||
#![allow(dead_code)]
|
||||
use std::future::Future;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue