Skip to content

Commit

Permalink
More ensure stack to avoid segfault with increased recursion_limit
Browse files Browse the repository at this point in the history
  • Loading branch information
JohnTitor committed Jul 27, 2020
1 parent 1841fb9 commit 00b380b
Showing 1 changed file with 28 additions and 18 deletions.
46 changes: 28 additions & 18 deletions src/librustc_trait_selection/traits/error_reporting/suggestions.rs
Expand Up @@ -7,6 +7,7 @@ use crate::autoderef::Autoderef;
use crate::infer::InferCtxt;
use crate::traits::normalize_projection_type;

use rustc_data_structures::stack::ensure_sufficient_stack;
use rustc_errors::{error_code, struct_span_err, Applicability, DiagnosticBuilder, Style};
use rustc_hir as hir;
use rustc_hir::def::DefKind;
Expand Down Expand Up @@ -1912,12 +1913,15 @@ impl<'a, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'a, 'tcx> {

let parent_predicate = parent_trait_ref.without_const().to_predicate(tcx);
if !self.is_recursive_obligation(obligated_types, &data.parent_code) {
self.note_obligation_cause_code(
err,
&parent_predicate,
&data.parent_code,
obligated_types,
);
// #74711: avoid a stack overflow
ensure_sufficient_stack(|| {
self.note_obligation_cause_code(
err,
&parent_predicate,
&data.parent_code,
obligated_types,
)
});
}
}
ObligationCauseCode::ImplDerivedObligation(ref data) => {
Expand All @@ -1928,22 +1932,28 @@ impl<'a, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'a, 'tcx> {
parent_trait_ref.skip_binder().self_ty()
));
let parent_predicate = parent_trait_ref.without_const().to_predicate(tcx);
self.note_obligation_cause_code(
err,
&parent_predicate,
&data.parent_code,
obligated_types,
);
// #74711: avoid a stack overflow
ensure_sufficient_stack(|| {
self.note_obligation_cause_code(
err,
&parent_predicate,
&data.parent_code,
obligated_types,
)
});
}
ObligationCauseCode::DerivedObligation(ref data) => {
let parent_trait_ref = self.resolve_vars_if_possible(&data.parent_trait_ref);
let parent_predicate = parent_trait_ref.without_const().to_predicate(tcx);
self.note_obligation_cause_code(
err,
&parent_predicate,
&data.parent_code,
obligated_types,
);
// #74711: avoid a stack overflow
ensure_sufficient_stack(|| {
self.note_obligation_cause_code(
err,
&parent_predicate,
&data.parent_code,
obligated_types,
)
});
}
ObligationCauseCode::CompareImplMethodObligation { .. } => {
err.note(&format!(
Expand Down

0 comments on commit 00b380b

Please sign in to comment.