@@ -127,33 +127,32 @@ where
127127        goal :  Goal < I ,  Self > , 
128128        assumption :  I :: Clause , 
129129    )  -> Result < ( ) ,  NoSolution >  { 
130-         if  let  Some ( trait_clause)  = assumption. as_trait_clause ( )  { 
131-             if  trait_clause. polarity ( )  != goal. predicate . polarity  { 
132-                 return  Err ( NoSolution ) ; 
133-             } 
134- 
135-             if  trait_clause. def_id ( )  == goal. predicate . def_id ( )  { 
136-                 if  DeepRejectCtxt :: relate_rigid_rigid ( ecx. cx ( ) ) . args_may_unify ( 
137-                     goal. predicate . trait_ref . args , 
138-                     trait_clause. skip_binder ( ) . trait_ref . args , 
139-                 )  { 
140-                     return  Ok ( ( ) ) ; 
141-                 } 
142-             } 
143- 
130+         fn  trait_def_id_matches < I :  Interner > ( 
131+             cx :  I , 
132+             clause_def_id :  I :: DefId , 
133+             goal_def_id :  I :: DefId , 
134+         )  -> bool  { 
135+             clause_def_id == goal_def_id
144136            // PERF(sized-hierarchy): Sizedness supertraits aren't elaborated to improve perf, so 
145-             // check for a `Sized` subtrait when looking for `MetaSized`. `PointeeSized` bounds 
146-             // are syntactic sugar for a lack of bounds so don't need this. 
147-             if  ecx. cx ( ) . is_lang_item ( goal. predicate . def_id ( ) ,  TraitSolverLangItem :: MetaSized ) 
148-                 && ecx. cx ( ) . is_lang_item ( trait_clause. def_id ( ) ,  TraitSolverLangItem :: Sized ) 
149-             { 
150-                 let  meta_sized_clause =
151-                     trait_predicate_with_def_id ( ecx. cx ( ) ,  trait_clause,  goal. predicate . def_id ( ) ) ; 
152-                 return  Self :: fast_reject_assumption ( ecx,  goal,  meta_sized_clause) ; 
153-             } 
137+             // check for a `MetaSized` supertrait being matched against a `Sized` assumption. 
138+             // 
139+             // `PointeeSized` bounds are syntactic sugar for a lack of bounds so don't need this. 
140+                 || ( cx. is_lang_item ( clause_def_id,  TraitSolverLangItem :: Sized ) 
141+                     && cx. is_lang_item ( goal_def_id,  TraitSolverLangItem :: MetaSized ) ) 
154142        } 
155143
156-         Err ( NoSolution ) 
144+         if  let  Some ( trait_clause)  = assumption. as_trait_clause ( ) 
145+             && trait_clause. polarity ( )  == goal. predicate . polarity 
146+             && trait_def_id_matches ( ecx. cx ( ) ,  trait_clause. def_id ( ) ,  goal. predicate . def_id ( ) ) 
147+             && DeepRejectCtxt :: relate_rigid_rigid ( ecx. cx ( ) ) . args_may_unify ( 
148+                 goal. predicate . trait_ref . args , 
149+                 trait_clause. skip_binder ( ) . trait_ref . args , 
150+             ) 
151+         { 
152+             return  Ok ( ( ) ) ; 
153+         }  else  { 
154+             Err ( NoSolution ) 
155+         } 
157156    } 
158157
159158    fn  match_assumption ( 
0 commit comments