Skip to content

Commit

Permalink
Auto merge of rust-lang#96808 - cjgillot:impossible-trait, r=compiler…
Browse files Browse the repository at this point in the history
…-errors

Detect trait fulfillment in `subst_and_check_impossible_predicates`

Split from rust-lang#91743
r? `@compiler-errors`
  • Loading branch information
bors committed May 10, 2022
2 parents 87fd70c + 69e5b2f commit 2226f19
Showing 1 changed file with 14 additions and 0 deletions.
14 changes: 14 additions & 0 deletions compiler/rustc_trait_selection/src/traits/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -432,6 +432,9 @@ pub fn impossible_predicates<'tcx>(
debug!("impossible_predicates(predicates={:?})", predicates);

let result = tcx.infer_ctxt().enter(|infcx| {
// HACK: Set tainted by errors to gracefully exit in case of overflow.
infcx.set_tainted_by_errors();

let param_env = ty::ParamEnv::reveal_all();
let mut selcx = SelectionContext::new(&infcx);
let mut fulfill_cx = FulfillmentContext::new();
Expand All @@ -448,6 +451,9 @@ pub fn impossible_predicates<'tcx>(

let errors = fulfill_cx.select_all_or_error(&infcx);

// Clean up after ourselves
let _ = infcx.inner.borrow_mut().opaque_type_storage.take_opaque_types();

!errors.is_empty()
});
debug!("impossible_predicates = {:?}", result);
Expand All @@ -461,6 +467,14 @@ fn subst_and_check_impossible_predicates<'tcx>(
debug!("subst_and_check_impossible_predicates(key={:?})", key);

let mut predicates = tcx.predicates_of(key.0).instantiate(tcx, key.1).predicates;

// Specifically check trait fulfillment to avoid an error when trying to resolve
// associated items.
if let Some(trait_def_id) = tcx.trait_of_item(key.0) {
let trait_ref = ty::TraitRef::from_method(tcx, trait_def_id, key.1);
predicates.push(ty::Binder::dummy(trait_ref).to_poly_trait_predicate().to_predicate(tcx));
}

predicates.retain(|predicate| !predicate.needs_subst());
let result = impossible_predicates(tcx, predicates);

Expand Down

0 comments on commit 2226f19

Please sign in to comment.