@@ -605,34 +605,31 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
605605
606606 let tables = self . in_progress_tables . map ( |t| t. borrow ( ) ) . unwrap ( ) ;
607607
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+ } )
625627 }
628+ _ => true ,
626629 }
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+ } ;
636633
637634 let ( snippet, last_ty) =
638635 if let ( true , hir:: TyKind :: TraitObject ( ..) , Ok ( snippet) , true , Some ( last_ty) ) = (
0 commit comments