Skip to content

Commit

Permalink
Rollup merge of rust-lang#74708 - kanru:issue-74564, r=davidtwco
Browse files Browse the repository at this point in the history
Ensure stack when type checking and building MIR for large if expressions

Fixes rust-lang#74564
  • Loading branch information
Dylan-DPC committed Jul 24, 2020
2 parents a64b544 + f64e58c commit bc36d69
Show file tree
Hide file tree
Showing 3 changed files with 10,427 additions and 2 deletions.
7 changes: 6 additions & 1 deletion src/librustc_mir_build/build/expr/into.rs
Expand Up @@ -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};
Expand Down Expand Up @@ -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)
Expand Down
3 changes: 2 additions & 1 deletion src/librustc_typeck/check/expr.rs
Expand Up @@ -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;
Expand Down Expand Up @@ -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 {
Expand Down

0 comments on commit bc36d69

Please sign in to comment.