diff options
| author | Michael Goulet <michael@errs.io> | 2023-05-18 19:05:43 +0000 |
|---|---|---|
| committer | Michael Goulet <michael@errs.io> | 2023-05-25 03:35:14 +0000 |
| commit | a2d806d56d3c3390b6874cb1eec90ca3c7191fda (patch) | |
| tree | 90f6d347477a413851203b9b667ab12631be1535 /compiler/rustc_trait_selection | |
| parent | e3f8beaed6d70d4b990f834fa617149e2bf40a2d (diff) | |
| download | rust-a2d806d56d3c3390b6874cb1eec90ca3c7191fda.tar.gz rust-a2d806d56d3c3390b6874cb1eec90ca3c7191fda.zip | |
Pre-populate MIR with opaques, prefer subst-relate candidate
Diffstat (limited to 'compiler/rustc_trait_selection')
| -rw-r--r-- | compiler/rustc_trait_selection/src/solve/mod.rs | 44 | ||||
| -rw-r--r-- | compiler/rustc_trait_selection/src/solve/opaques.rs | 9 |
2 files changed, 25 insertions, 28 deletions
diff --git a/compiler/rustc_trait_selection/src/solve/mod.rs b/compiler/rustc_trait_selection/src/solve/mod.rs index 1427268f829..26ace28f5fd 100644 --- a/compiler/rustc_trait_selection/src/solve/mod.rs +++ b/compiler/rustc_trait_selection/src/solve/mod.rs @@ -239,34 +239,34 @@ impl<'a, 'tcx> EvalCtxt<'a, 'tcx> { evaluate_normalizes_to(self, alias_rhs, lhs, direction, Invert::Yes).ok(), ); // Relate via substs - candidates.extend( - self.probe(|ecx| { - let span = tracing::span!( - tracing::Level::DEBUG, - "compute_alias_relate_goal(relate_via_substs)", - ?alias_lhs, - ?alias_rhs, - ?direction - ); - let _enter = span.enter(); - - match direction { - ty::AliasRelationDirection::Equate => { - ecx.eq(goal.param_env, alias_lhs, alias_rhs)?; - } - ty::AliasRelationDirection::Subtype => { - ecx.sub(goal.param_env, alias_lhs, alias_rhs)?; - } + let subst_relate_response = self.probe(|ecx| { + let span = tracing::span!( + tracing::Level::DEBUG, + "compute_alias_relate_goal(relate_via_substs)", + ?alias_lhs, + ?alias_rhs, + ?direction + ); + let _enter = span.enter(); + + match direction { + ty::AliasRelationDirection::Equate => { + ecx.eq(goal.param_env, alias_lhs, alias_rhs)?; + } + ty::AliasRelationDirection::Subtype => { + ecx.sub(goal.param_env, alias_lhs, alias_rhs)?; } + } - ecx.evaluate_added_goals_and_make_canonical_response(Certainty::Yes) - }) - .ok(), - ); + ecx.evaluate_added_goals_and_make_canonical_response(Certainty::Yes) + }); + candidates.extend(subst_relate_response); debug!(?candidates); if let Some(merged) = self.try_merge_responses(&candidates) { Ok(merged) + } else if let Ok(subst_relate_response) = subst_relate_response { + Ok(subst_relate_response) } else { self.flounder(&candidates) } diff --git a/compiler/rustc_trait_selection/src/solve/opaques.rs b/compiler/rustc_trait_selection/src/solve/opaques.rs index 1d5bb46450c..f97f54e760e 100644 --- a/compiler/rustc_trait_selection/src/solve/opaques.rs +++ b/compiler/rustc_trait_selection/src/solve/opaques.rs @@ -1,6 +1,6 @@ use rustc_middle::traits::query::NoSolution; use rustc_middle::traits::solve::{Certainty, Goal, QueryResult}; -use rustc_middle::traits::{ObligationCause, Reveal}; +use rustc_middle::traits::Reveal; use rustc_middle::ty; use rustc_middle::ty::util::NotUniqueParam; @@ -37,11 +37,8 @@ impl<'tcx> EvalCtxt<'_, 'tcx> { Ok(()) => {} } // Prefer opaques registered already. - let matches = self.unify_existing_opaque_tys( - goal.param_env, - opaque_ty, - expected - ); + let matches = + self.unify_existing_opaque_tys(goal.param_env, opaque_ty, expected); if !matches.is_empty() { if let Some(response) = self.try_merge_responses(&matches) { return Ok(response); |
