mirror of
https://github.com/rust-lang/rust.git
synced 2025-01-26 14:43:24 +00:00
Rollup merge of #94849 - ouz-a:master4, r=oli-obk
Check var scope if it exist Fixes #92893. Added helper function to check the scope of a variable, if it doesn't have a scope call delay_span_bug, which avoids us trying to get a block/scope that doesn't exist. Had to increase `ROOT_ENTRY_LIMIT` was getting tidy error
This commit is contained in:
commit
a32e0f3041
@ -362,12 +362,9 @@ impl ScopeTree {
|
||||
self.parent_map.get(&id).cloned().map(|(p, _)| p)
|
||||
}
|
||||
|
||||
/// Returns the lifetime of the local variable `var_id`
|
||||
pub fn var_scope(&self, var_id: hir::ItemLocalId) -> Scope {
|
||||
self.var_map
|
||||
.get(&var_id)
|
||||
.cloned()
|
||||
.unwrap_or_else(|| bug!("no enclosing scope for id {:?}", var_id))
|
||||
/// Returns the lifetime of the local variable `var_id`, if any.
|
||||
pub fn var_scope(&self, var_id: hir::ItemLocalId) -> Option<Scope> {
|
||||
self.var_map.get(&var_id).cloned()
|
||||
}
|
||||
|
||||
/// Returns the scope when the temp created by `expr_id` will be cleaned up.
|
||||
|
@ -701,8 +701,9 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
|
||||
let local_id = self.var_local_id(var, for_guard);
|
||||
let source_info = self.source_info(span);
|
||||
self.cfg.push(block, Statement { source_info, kind: StatementKind::StorageLive(local_id) });
|
||||
let region_scope = self.region_scope_tree.var_scope(var.local_id);
|
||||
if schedule_drop {
|
||||
// Altough there is almost always scope for given variable in corner cases
|
||||
// like #92893 we might get variable with no scope.
|
||||
if let Some(region_scope) = self.region_scope_tree.var_scope(var.local_id) && schedule_drop{
|
||||
self.schedule_drop(span, region_scope, local_id, DropKind::Storage);
|
||||
}
|
||||
Place::from(local_id)
|
||||
@ -710,8 +711,9 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
|
||||
|
||||
crate fn schedule_drop_for_binding(&mut self, var: HirId, span: Span, for_guard: ForGuard) {
|
||||
let local_id = self.var_local_id(var, for_guard);
|
||||
let region_scope = self.region_scope_tree.var_scope(var.local_id);
|
||||
self.schedule_drop(span, region_scope, local_id, DropKind::Value);
|
||||
if let Some(region_scope) = self.region_scope_tree.var_scope(var.local_id) {
|
||||
self.schedule_drop(span, region_scope, local_id, DropKind::Value);
|
||||
}
|
||||
}
|
||||
|
||||
/// Visit all of the primary bindings in a patterns, that is, visit the
|
||||
|
@ -319,7 +319,7 @@ impl<'a, 'tcx> Visitor<'tcx> for InteriorVisitor<'a, 'tcx> {
|
||||
self.expr_count += 1;
|
||||
|
||||
if let PatKind::Binding(..) = pat.kind {
|
||||
let scope = self.region_scope_tree.var_scope(pat.hir_id.local_id);
|
||||
let scope = self.region_scope_tree.var_scope(pat.hir_id.local_id).unwrap();
|
||||
let ty = self.fcx.typeck_results.borrow().pat_ty(pat);
|
||||
self.record(ty, pat.hir_id, Some(scope), None, pat.span, false);
|
||||
}
|
||||
|
7
src/test/ui/mir/issue-92893.rs
Normal file
7
src/test/ui/mir/issue-92893.rs
Normal file
@ -0,0 +1,7 @@
|
||||
struct Bug<A = [(); (let a = (), 1).1]> {
|
||||
//~^ `let` expressions are not supported here
|
||||
//~^^ `let` expressions in this position are unstable [E0658]
|
||||
a: A
|
||||
}
|
||||
|
||||
fn main() {}
|
20
src/test/ui/mir/issue-92893.stderr
Normal file
20
src/test/ui/mir/issue-92893.stderr
Normal file
@ -0,0 +1,20 @@
|
||||
error: `let` expressions are not supported here
|
||||
--> $DIR/issue-92893.rs:1:22
|
||||
|
|
||||
LL | struct Bug<A = [(); (let a = (), 1).1]> {
|
||||
| ^^^^^^^^^^
|
||||
|
|
||||
= note: only supported directly in conditions of `if` and `while` expressions
|
||||
|
||||
error[E0658]: `let` expressions in this position are unstable
|
||||
--> $DIR/issue-92893.rs:1:22
|
||||
|
|
||||
LL | struct Bug<A = [(); (let a = (), 1).1]> {
|
||||
| ^^^^^^^^^^
|
||||
|
|
||||
= note: see issue #53667 <https://github.com/rust-lang/rust/issues/53667> for more information
|
||||
= help: add `#![feature(let_chains)]` to the crate attributes to enable
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0658`.
|
@ -59,7 +59,7 @@ pub(super) fn check<'tcx>(
|
||||
if let Some(indexed_extent) = indexed_extent {
|
||||
let parent_def_id = cx.tcx.hir().get_parent_item(expr.hir_id);
|
||||
let region_scope_tree = cx.tcx.region_scope_tree(parent_def_id);
|
||||
let pat_extent = region_scope_tree.var_scope(pat.hir_id.local_id);
|
||||
let pat_extent = region_scope_tree.var_scope(pat.hir_id.local_id).unwrap();
|
||||
if region_scope_tree.is_subscope_of(indexed_extent, pat_extent) {
|
||||
return;
|
||||
}
|
||||
@ -262,7 +262,7 @@ impl<'a, 'tcx> VarVisitor<'a, 'tcx> {
|
||||
match res {
|
||||
Res::Local(hir_id) => {
|
||||
let parent_def_id = self.cx.tcx.hir().get_parent_item(expr.hir_id);
|
||||
let extent = self.cx.tcx.region_scope_tree(parent_def_id).var_scope(hir_id.local_id);
|
||||
let extent = self.cx.tcx.region_scope_tree(parent_def_id).var_scope(hir_id.local_id).unwrap();
|
||||
if index_used_directly {
|
||||
self.indexed_directly.insert(
|
||||
seqvar.segments[0].ident.name,
|
||||
|
@ -160,8 +160,8 @@ impl<'tcx> LateLintPass<'tcx> for Shadow {
|
||||
|
||||
fn is_shadow(cx: &LateContext<'_>, owner: LocalDefId, first: ItemLocalId, second: ItemLocalId) -> bool {
|
||||
let scope_tree = cx.tcx.region_scope_tree(owner.to_def_id());
|
||||
let first_scope = scope_tree.var_scope(first);
|
||||
let second_scope = scope_tree.var_scope(second);
|
||||
let first_scope = scope_tree.var_scope(first).unwrap();
|
||||
let second_scope = scope_tree.var_scope(second).unwrap();
|
||||
scope_tree.is_subscope_of(second_scope, first_scope)
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user