@@ -501,6 +501,8 @@ pub use helper::*;
501501
502502mod  helper { 
503503    use  super :: * ; 
504+     // Note: the methods below use a `slice.chain(Option).chain(Option)` pattern so that all paths 
505+     // produce an iterator with the same concrete type. 
504506    pub  type  Successors < ' a >  = impl  DoubleEndedIterator < Item  = BasicBlock >  + ' a ; 
505507
506508    impl  SwitchTargets  { 
@@ -510,7 +512,7 @@ mod helper {
510512        #[ define_opaque( Successors ) ]  
511513        pub  fn  successors_for_value ( & self ,  value :  u128 )  -> Successors < ' _ >  { 
512514            let  target = self . target_for_value ( value) ; 
513-             ( & [ ] ) . into_iter ( ) . copied ( ) . chain ( Some ( target) . into_iter ( ) . chain ( None ) ) 
515+             ( & [ ] ) . into_iter ( ) . copied ( ) . chain ( Some ( target) ) . chain ( None ) 
514516        } 
515517    } 
516518
@@ -522,10 +524,7 @@ mod helper {
522524            match  * self  { 
523525                // 3-successors for async drop: target, unwind, dropline (parent coroutine drop) 
524526                Drop  {  target :  ref  t,  unwind :  UnwindAction :: Cleanup ( u) ,  drop :  Some ( d) ,  .. }  => { 
525-                     slice:: from_ref ( t) 
526-                         . into_iter ( ) 
527-                         . copied ( ) 
528-                         . chain ( Some ( u) . into_iter ( ) . chain ( Some ( d) ) ) 
527+                     slice:: from_ref ( t) . into_iter ( ) . copied ( ) . chain ( Some ( u) ) . chain ( Some ( d) ) 
529528                } 
530529                // 2-successors 
531530                Call  {  target :  Some ( ref  t) ,  unwind :  UnwindAction :: Cleanup ( u) ,  .. } 
@@ -534,7 +533,7 @@ mod helper {
534533                | Drop  {  target :  ref  t,  unwind :  _,  drop :  Some ( u) ,  .. } 
535534                | Assert  {  target :  ref  t,  unwind :  UnwindAction :: Cleanup ( u) ,  .. } 
536535                | FalseUnwind  {  real_target :  ref  t,  unwind :  UnwindAction :: Cleanup ( u)  }  => { 
537-                     slice:: from_ref ( t) . into_iter ( ) . copied ( ) . chain ( Some ( u) . into_iter ( ) . chain ( None ) ) 
536+                     slice:: from_ref ( t) . into_iter ( ) . copied ( ) . chain ( Some ( u) ) . chain ( None ) 
538537                } 
539538                // single successor 
540539                Goto  {  target :  ref  t } 
@@ -544,7 +543,7 @@ mod helper {
544543                | Drop  {  target :  ref  t,  unwind :  _,  .. } 
545544                | Assert  {  target :  ref  t,  unwind :  _,  .. } 
546545                | FalseUnwind  {  real_target :  ref  t,  unwind :  _ }  => { 
547-                     slice:: from_ref ( t) . into_iter ( ) . copied ( ) . chain ( None . into_iter ( ) . chain ( None ) ) 
546+                     slice:: from_ref ( t) . into_iter ( ) . copied ( ) . chain ( None ) . chain ( None ) 
548547                } 
549548                // No successors 
550549                UnwindResume 
@@ -554,23 +553,24 @@ mod helper {
554553                | Unreachable 
555554                | TailCall  {  .. } 
556555                | Call  {  target :  None ,  unwind :  _,  .. }  => { 
557-                     ( & [ ] ) . into_iter ( ) . copied ( ) . chain ( None . into_iter ( ) . chain ( None ) ) 
556+                     ( & [ ] ) . into_iter ( ) . copied ( ) . chain ( None ) . chain ( None ) 
558557                } 
559558                // Multiple successors 
560559                InlineAsm  {  ref  targets,  unwind :  UnwindAction :: Cleanup ( u) ,  .. }  => { 
561-                     targets. iter ( ) . copied ( ) . chain ( Some ( u) . into_iter ( ) . chain ( None ) ) 
560+                     targets. iter ( ) . copied ( ) . chain ( Some ( u) ) . chain ( None ) 
562561                } 
563562                InlineAsm  {  ref  targets,  unwind :  _,  .. }  => { 
564-                     targets. iter ( ) . copied ( ) . chain ( None . into_iter ( ) . chain ( None ) ) 
563+                     targets. iter ( ) . copied ( ) . chain ( None ) . chain ( None ) 
565564                } 
566565                SwitchInt  {  ref  targets,  .. }  => { 
567-                     targets. targets . iter ( ) . copied ( ) . chain ( None . into_iter ( ) . chain ( None ) ) 
566+                     targets. targets . iter ( ) . copied ( ) . chain ( None ) . chain ( None ) 
568567                } 
569568                // FalseEdge 
570569                FalseEdge  {  ref  real_target,  imaginary_target }  => slice:: from_ref ( real_target) 
571570                    . into_iter ( ) 
572571                    . copied ( ) 
573-                     . chain ( Some ( imaginary_target) . into_iter ( ) . chain ( None ) ) , 
572+                     . chain ( Some ( imaginary_target) ) 
573+                     . chain ( None ) , 
574574            } 
575575        } 
576576
0 commit comments