Treat projections with infer as placeholder during fast reject in new solver
This commit is contained in:
parent
f1b1ed7e18
commit
c32527fb92
15 changed files with 186 additions and 68 deletions
|
@ -8,7 +8,7 @@ use rustc_hir::LangItem;
|
|||
use rustc_infer::traits::query::NoSolution;
|
||||
use rustc_infer::traits::util::supertraits;
|
||||
use rustc_middle::traits::solve::{CanonicalResponse, Certainty, Goal, QueryResult};
|
||||
use rustc_middle::ty::fast_reject::{DeepRejectCtxt, TreatParams};
|
||||
use rustc_middle::ty::fast_reject::{DeepRejectCtxt, TreatParams, TreatProjections};
|
||||
use rustc_middle::ty::{self, ToPredicate, Ty, TyCtxt};
|
||||
use rustc_middle::ty::{TraitPredicate, TypeVisitableExt};
|
||||
use rustc_span::DUMMY_SP;
|
||||
|
@ -135,9 +135,15 @@ impl<'tcx> assembly::GoalKind<'tcx> for TraitPredicate<'tcx> {
|
|||
// currently instead lint patterns which can be used to
|
||||
// exploit this unsoundness on stable, see #93367 for
|
||||
// more details.
|
||||
//
|
||||
// Using `TreatProjections::NextSolverLookup` is fine here because
|
||||
// `instantiate_constituent_tys_for_auto_trait` returns nothing for
|
||||
// projection types anyways. So it doesn't really matter what we do
|
||||
// here, and this is faster.
|
||||
if let Some(def_id) = ecx.tcx().find_map_relevant_impl(
|
||||
goal.predicate.def_id(),
|
||||
goal.predicate.self_ty(),
|
||||
TreatProjections::NextSolverLookup,
|
||||
Some,
|
||||
) {
|
||||
debug!(?def_id, ?goal, "disqualified auto-trait implementation");
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue