@@ -605,34 +605,31 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
605
605
606
606
let tables = self . in_progress_tables . map ( |t| t. borrow ( ) ) . unwrap ( ) ;
607
607
608
- let mut all_returns_conform_to_trait = true ;
609
- let mut all_returns_have_same_type = true ;
610
- let mut last_ty = None ;
611
- if let Some ( ty_ret_ty) = tables. node_type_opt ( ret_ty. hir_id ) {
612
- let cause = ObligationCause :: misc ( ret_ty. span , ret_ty. hir_id ) ;
613
- let param_env = ty:: ParamEnv :: empty ( ) ;
614
- if let ty:: Dynamic ( predicates, _) = & ty_ret_ty. kind {
615
- for expr in & visitor. 0 {
616
- if let Some ( returned_ty) = tables. node_type_opt ( expr. hir_id ) {
617
- all_returns_have_same_type &=
618
- Some ( returned_ty) == last_ty || last_ty. is_none ( ) ;
619
- last_ty = Some ( returned_ty) ;
620
- for predicate in predicates. iter ( ) {
621
- let pred = predicate. with_self_ty ( self . tcx , returned_ty) ;
622
- let obl = Obligation :: new ( cause. clone ( ) , param_env, pred) ;
623
- all_returns_conform_to_trait &= self . predicate_may_hold ( & obl) ;
624
- }
608
+ let mut ret_types = visitor. 0 . iter ( ) . filter_map ( |expr| tables. node_type_opt ( expr. hir_id ) ) ;
609
+ let ( last_ty, all_returns_have_same_type) =
610
+ ret_types. clone ( ) . fold ( ( None , true ) , |( last_ty, mut same) , returned_ty| {
611
+ same &= last_ty. map_or ( true , |ty| ty == returned_ty) ;
612
+ ( Some ( returned_ty) , same)
613
+ } ) ;
614
+ let all_returns_conform_to_trait =
615
+ if let Some ( ty_ret_ty) = tables. node_type_opt ( ret_ty. hir_id ) {
616
+ match ty_ret_ty. kind {
617
+ ty:: Dynamic ( predicates, _) => {
618
+ let cause = ObligationCause :: misc ( ret_ty. span , ret_ty. hir_id ) ;
619
+ let param_env = ty:: ParamEnv :: empty ( ) ;
620
+ ret_types. all ( |returned_ty| {
621
+ predicates. iter ( ) . all ( |predicate| {
622
+ let pred = predicate. with_self_ty ( self . tcx , returned_ty) ;
623
+ let obl = Obligation :: new ( cause. clone ( ) , param_env, pred) ;
624
+ self . predicate_may_hold ( & obl)
625
+ } )
626
+ } )
625
627
}
628
+ _ => true ,
626
629
}
627
- }
628
- } else {
629
- // We still want to verify whether all the return types conform to each other.
630
- for expr in & visitor. 0 {
631
- let returned_ty = tables. node_type_opt ( expr. hir_id ) ;
632
- all_returns_have_same_type &= last_ty == returned_ty || last_ty. is_none ( ) ;
633
- last_ty = returned_ty;
634
- }
635
- }
630
+ } else {
631
+ true
632
+ } ;
636
633
637
634
let ( snippet, last_ty) =
638
635
if let ( true , hir:: TyKind :: TraitObject ( ..) , Ok ( snippet) , true , Some ( last_ty) ) = (
0 commit comments