-
Notifications
You must be signed in to change notification settings - Fork 13.4k
[drop tracking] Use parent expression for scope, not parent node #101217
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 1 commit
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -387,6 +387,18 @@ impl<'a, 'tcx> Visitor<'tcx> for InteriorVisitor<'a, 'tcx> { | |
ty.needs_drop(self.fcx.tcx, self.fcx.param_env) | ||
}; | ||
|
||
let find_parent_expr = |mut hir_id| { | ||
let hir = self.fcx.tcx.hir(); | ||
hir_id = hir.find_parent_node(hir_id)?; | ||
loop { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Ah, thanks! I didn't know about that method. I think that's way cleaner, so I rewrote my code to use that. I also added a doc comment to |
||
if let hir::Node::Expr(_) = self.fcx.tcx.hir().find(hir_id)? { | ||
jyn514 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
return Some(hir_id); | ||
} else { | ||
hir_id = hir.find_parent_node(hir_id)?; | ||
} | ||
} | ||
}; | ||
|
||
// Typically, the value produced by an expression is consumed by its parent in some way, | ||
// so we only have to check if the parent contains a yield (note that the parent may, for | ||
// example, store the value into a local variable, but then we already consider local | ||
|
@@ -409,8 +421,9 @@ 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 = find_parent_expr(expr.hir_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) | ||
|
Uh oh!
There was an error while loading. Please reload this page.