@@ -64,20 +64,6 @@ mod _match;
6464mod candidate_assembly;
6565mod confirmation;
6666
67- /// Whether to consider the binder of higher ranked goals for the `leak_check` when
68- /// evaluating higher-ranked goals. See #119820 for more info.
69- ///
70- /// While this is a bit hacky, it is necessary to match the behavior of the new solver:
71- /// We eagerly instantiate binders in the new solver, outside of candidate selection, so
72- /// the leak check inside of candidates does not consider any bound vars from the higher
73- /// ranked goal. However, we do exit the binder once we're completely finished with a goal,
74- /// so the leak-check can be used in evaluate by causing nested higher-ranked goals to fail.
75- #[ derive( Debug , Copy , Clone ) ]
76- enum LeakCheckHigherRankedGoal {
77- No ,
78- Yes ,
79- }
80-
8167#[ derive( Clone , Debug , Eq , PartialEq , Hash ) ]
8268pub enum IntercrateAmbiguityCause < ' tcx > {
8369 DownstreamCrate { trait_ref : ty:: TraitRef < ' tcx > , self_ty : Option < Ty < ' tcx > > } ,
@@ -402,10 +388,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
402388 let mut no_candidates_apply = true ;
403389
404390 for c in candidate_set. vec . iter ( ) {
405- if self
406- . evaluate_candidate ( stack, c, LeakCheckHigherRankedGoal :: No ) ?
407- . may_apply ( )
408- {
391+ if self . evaluate_candidate ( stack, c) ?. may_apply ( ) {
409392 no_candidates_apply = false ;
410393 break ;
411394 }
@@ -476,7 +459,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
476459 // is needed for specialization. Propagate overflow if it occurs.
477460 let mut candidates = candidates
478461 . into_iter ( )
479- . map ( |c| match self . evaluate_candidate ( stack, & c, LeakCheckHigherRankedGoal :: No ) {
462+ . map ( |c| match self . evaluate_candidate ( stack, & c) {
480463 Ok ( eval) if eval. may_apply ( ) => {
481464 Ok ( Some ( EvaluatedCandidate { candidate : c, evaluation : eval } ) )
482465 }
@@ -566,7 +549,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
566549 obligation : & PredicateObligation < ' tcx > ,
567550 ) -> Result < EvaluationResult , OverflowError > {
568551 debug_assert ! ( !self . infcx. next_trait_solver( ) ) ;
569- self . evaluation_probe ( |this, _outer_universe | {
552+ self . evaluation_probe ( |this| {
570553 let goal =
571554 this. infcx . resolve_vars_if_possible ( ( obligation. predicate , obligation. param_env ) ) ;
572555 let mut result = this. evaluate_predicate_recursively (
@@ -589,11 +572,11 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
589572 /// `op`, but this can be overwritten if necessary.
590573 fn evaluation_probe (
591574 & mut self ,
592- op : impl FnOnce ( & mut Self , & mut ty :: UniverseIndex ) -> Result < EvaluationResult , OverflowError > ,
575+ op : impl FnOnce ( & mut Self ) -> Result < EvaluationResult , OverflowError > ,
593576 ) -> Result < EvaluationResult , OverflowError > {
594577 self . infcx . probe ( |snapshot| -> Result < EvaluationResult , OverflowError > {
595- let mut outer_universe = self . infcx . universe ( ) ;
596- let result = op ( self , & mut outer_universe ) ?;
578+ let outer_universe = self . infcx . universe ( ) ;
579+ let result = op ( self ) ?;
597580
598581 match self . infcx . leak_check ( outer_universe, Some ( snapshot) ) {
599582 Ok ( ( ) ) => { }
@@ -1254,7 +1237,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
12541237 }
12551238
12561239 match self . candidate_from_obligation ( stack) {
1257- Ok ( Some ( c) ) => self . evaluate_candidate ( stack, & c, LeakCheckHigherRankedGoal :: Yes ) ,
1240+ Ok ( Some ( c) ) => self . evaluate_candidate ( stack, & c) ,
12581241 Ok ( None ) => Ok ( EvaluatedToAmbig ) ,
12591242 Err ( Overflow ( OverflowError :: Canonical ) ) => Err ( OverflowError :: Canonical ) ,
12601243 Err ( ..) => Ok ( EvaluatedToErr ) ,
@@ -1279,10 +1262,6 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
12791262 /// Further evaluates `candidate` to decide whether all type parameters match and whether nested
12801263 /// obligations are met. Returns whether `candidate` remains viable after this further
12811264 /// scrutiny.
1282- ///
1283- /// Depending on the value of [LeakCheckHigherRankedGoal], we may ignore the binder of the goal
1284- /// when eagerly detecting higher ranked region errors via the `leak_check`. See that enum for
1285- /// more info.
12861265 #[ instrument(
12871266 level = "debug" ,
12881267 skip( self , stack) ,
@@ -1293,25 +1272,9 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
12931272 & mut self ,
12941273 stack : & TraitObligationStack < ' o , ' tcx > ,
12951274 candidate : & SelectionCandidate < ' tcx > ,
1296- leak_check_higher_ranked_goal : LeakCheckHigherRankedGoal ,
12971275 ) -> Result < EvaluationResult , OverflowError > {
1298- let mut result = self . evaluation_probe ( |this, outer_universe| {
1299- // We eagerly instantiate higher ranked goals to prevent universe errors
1300- // from impacting candidate selection. This matches the behavior of the new
1301- // solver. This slightly weakens type inference.
1302- //
1303- // In case there are no unresolved type or const variables this
1304- // should still not be necessary to select a unique impl as any overlap
1305- // relying on a universe error from higher ranked goals should have resulted
1306- // in an overlap error in coherence.
1307- let p = self . infcx . enter_forall_and_leak_universe ( stack. obligation . predicate ) ;
1308- let obligation = stack. obligation . with ( this. tcx ( ) , ty:: Binder :: dummy ( p) ) ;
1309- match leak_check_higher_ranked_goal {
1310- LeakCheckHigherRankedGoal :: No => * outer_universe = self . infcx . universe ( ) ,
1311- LeakCheckHigherRankedGoal :: Yes => { }
1312- }
1313-
1314- match this. confirm_candidate ( & obligation, candidate. clone ( ) ) {
1276+ let mut result = self . evaluation_probe ( |this| {
1277+ match this. confirm_candidate ( stack. obligation , candidate. clone ( ) ) {
13151278 Ok ( selection) => {
13161279 debug ! ( ?selection) ;
13171280 this. evaluate_predicates_recursively (
@@ -1731,19 +1694,14 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
17311694 } )
17321695 . map_err ( |_| ( ) )
17331696 }
1697+
17341698 fn where_clause_may_apply < ' o > (
17351699 & mut self ,
17361700 stack : & TraitObligationStack < ' o , ' tcx > ,
17371701 where_clause_trait_ref : ty:: PolyTraitRef < ' tcx > ,
17381702 ) -> Result < EvaluationResult , OverflowError > {
1739- self . evaluation_probe ( |this, outer_universe| {
1740- // Eagerly instantiate higher ranked goals.
1741- //
1742- // See the comment in `evaluate_candidate` to see why.
1743- let p = self . infcx . enter_forall_and_leak_universe ( stack. obligation . predicate ) ;
1744- let obligation = stack. obligation . with ( this. tcx ( ) , ty:: Binder :: dummy ( p) ) ;
1745- * outer_universe = self . infcx . universe ( ) ;
1746- match this. match_where_clause_trait_ref ( & obligation, where_clause_trait_ref) {
1703+ self . evaluation_probe ( |this| {
1704+ match this. match_where_clause_trait_ref ( stack. obligation , where_clause_trait_ref) {
17471705 Ok ( obligations) => this. evaluate_predicates_recursively ( stack. list ( ) , obligations) ,
17481706 Err ( ( ) ) => Ok ( EvaluatedToErr ) ,
17491707 }
0 commit comments