File tree Expand file tree Collapse file tree 2 files changed +39
-3
lines changed Expand file tree Collapse file tree 2 files changed +39
-3
lines changed Original file line number Diff line number Diff line change @@ -617,12 +617,22 @@ impl<'tcx> Relate<'tcx> for &'tcx ty::List<ty::ExistentialPredicate<'tcx>> {
617617        a :  & Self , 
618618        b :  & Self , 
619619    )  -> RelateResult < ' tcx ,  Self >  { 
620-         if  a. len ( )  != b. len ( )  { 
620+         let  tcx = relation. tcx ( ) ; 
621+ 
622+         // FIXME: this is wasteful, but want to do a perf run to see how slow it is. 
623+         // We need to perform this deduplication as we sometimes generate duplicate projections 
624+         // in `a`. 
625+         let  mut  a_v:  Vec < _ >  = a. into_iter ( ) . collect ( ) ; 
626+         let  mut  b_v:  Vec < _ >  = b. into_iter ( ) . collect ( ) ; 
627+         a_v. sort_by ( |a,  b| a. stable_cmp ( tcx,  b) ) ; 
628+         a_v. dedup ( ) ; 
629+         b_v. sort_by ( |a,  b| a. stable_cmp ( tcx,  b) ) ; 
630+         b_v. dedup ( ) ; 
631+         if  a_v. len ( )  != b_v. len ( )  { 
621632            return  Err ( TypeError :: ExistentialMismatch ( expected_found ( relation,  a,  b) ) ) ; 
622633        } 
623634
624-         let  tcx = relation. tcx ( ) ; 
625-         let  v = a. iter ( ) . zip ( b. iter ( ) ) . map ( |( ep_a,  ep_b) | { 
635+         let  v = a_v. into_iter ( ) . zip ( b_v. into_iter ( ) ) . map ( |( ep_a,  ep_b) | { 
626636            use  crate :: ty:: ExistentialPredicate :: * ; 
627637            match  ( ep_a,  ep_b)  { 
628638                ( Trait ( ref  a) ,  Trait ( ref  b) )  => Ok ( Trait ( relation. relate ( a,  b) ?) ) , 
Original file line number Diff line number Diff line change 1+ // check-pass 
2+ trait  Service  { 
3+     type  S ; 
4+ } 
5+ 
6+ trait  Framing  { 
7+     type  F ; 
8+ } 
9+ 
10+ impl  Framing  for  ( )  { 
11+     type  F  = ( ) ; 
12+ } 
13+ 
14+ trait  HttpService < F :  Framing > :  Service < S  = F :: F >  { } 
15+ 
16+ type  BoxService  = Box < dyn  HttpService < ( ) ,  S  = ( ) > > ; 
17+ 
18+ fn  build_server < F :  FnOnce ( )  -> BoxService > ( _:  F )  { } 
19+ 
20+ fn  make_server < F :  Framing > ( )  -> Box < dyn  HttpService < F ,  S  = F :: F > >  { 
21+     unimplemented ! ( ) 
22+ } 
23+ 
24+ fn  main ( )  { 
25+     build_server ( || make_server ( ) ) 
26+ } 
 
 
   
 
     
   
   
          
    
    
     
    
      
     
     
    You can’t perform that action at this time.
  
 
    
  
    
      
        
     
       
      
     
   
 
    
    
  
 
  
 
     
    
0 commit comments