Auto merge of #74708 - kanru:issue-74564, r=davidtwco
Ensure stack when type checking and building MIR for large if expressions Fixes #74564
This commit is contained in:
commit
c70986264b
@ -17,6 +17,7 @@ use rustc_ast::visit::{self, AssocCtxt, Visitor};
|
||||
use rustc_ast_pretty::pprust;
|
||||
use rustc_attr::{self as attr, is_builtin_attr, HasAttrs};
|
||||
use rustc_data_structures::map_in_place::MapInPlace;
|
||||
use rustc_data_structures::stack::ensure_sufficient_stack;
|
||||
use rustc_errors::{Applicability, PResult};
|
||||
use rustc_feature::Features;
|
||||
use rustc_parse::parser::Parser;
|
||||
@ -1165,7 +1166,7 @@ impl<'a, 'b> MutVisitor for InvocationCollector<'a, 'b> {
|
||||
self.check_attributes(&expr.attrs);
|
||||
self.collect_bang(mac, expr.span, AstFragmentKind::Expr).make_expr().into_inner()
|
||||
} else {
|
||||
noop_visit_expr(&mut expr, self);
|
||||
ensure_sufficient_stack(|| noop_visit_expr(&mut expr, self));
|
||||
expr
|
||||
}
|
||||
});
|
||||
|
@ -5,6 +5,7 @@ use crate::build::{BlockAnd, BlockAndExtension, BlockFrame, Builder};
|
||||
use crate::hair::*;
|
||||
use rustc_ast::ast::InlineAsmOptions;
|
||||
use rustc_data_structures::fx::FxHashMap;
|
||||
use rustc_data_structures::stack::ensure_sufficient_stack;
|
||||
use rustc_hir as hir;
|
||||
use rustc_middle::mir::*;
|
||||
use rustc_middle::ty::{self, CanonicalUserTypeAnnotation};
|
||||
@ -43,7 +44,11 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
|
||||
let block_and = match expr.kind {
|
||||
ExprKind::Scope { region_scope, lint_level, value } => {
|
||||
let region_scope = (region_scope, source_info);
|
||||
this.in_scope(region_scope, lint_level, |this| this.into(destination, block, value))
|
||||
ensure_sufficient_stack(|| {
|
||||
this.in_scope(region_scope, lint_level, |this| {
|
||||
this.into(destination, block, value)
|
||||
})
|
||||
})
|
||||
}
|
||||
ExprKind::Block { body: ast_block } => {
|
||||
this.ast_block(destination, block, ast_block, source_info)
|
||||
|
@ -19,6 +19,7 @@ use crate::type_error_struct;
|
||||
use rustc_ast::ast;
|
||||
use rustc_ast::util::lev_distance::find_best_match_for_name;
|
||||
use rustc_data_structures::fx::FxHashMap;
|
||||
use rustc_data_structures::stack::ensure_sufficient_stack;
|
||||
use rustc_errors::ErrorReported;
|
||||
use rustc_errors::{pluralize, struct_span_err, Applicability, DiagnosticBuilder, DiagnosticId};
|
||||
use rustc_hir as hir;
|
||||
@ -177,7 +178,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
let old_diverges = self.diverges.replace(Diverges::Maybe);
|
||||
let old_has_errors = self.has_errors.replace(false);
|
||||
|
||||
let ty = self.check_expr_kind(expr, expected);
|
||||
let ty = ensure_sufficient_stack(|| self.check_expr_kind(expr, expected));
|
||||
|
||||
// Warn for non-block expressions with diverging children.
|
||||
match expr.kind {
|
||||
|
10419
src/test/ui/issues/issue-74564-if-expr-stack-overflow.rs
Normal file
10419
src/test/ui/issues/issue-74564-if-expr-stack-overflow.rs
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user