@@ -34,6 +34,8 @@ impl<'tcx> MirPass<'tcx> for Deaggregator {
3434
3535        // Do not trigger on constants.  Could be revised in future 
3636        if  let  MirSource :: Fn ( _)  = source { }  else  {  return ;  } 
37+         // In fact, we might not want to trigger in other cases. 
38+         // Ex: when we could use SROA.  See issue #35259 
3739
3840        let  mut  curr:  usize  = 0 ; 
3941        for  bb in  mir. basic_blocks_mut ( )  { 
@@ -90,21 +92,24 @@ fn get_aggregate_statement<'a, 'tcx, 'b>(curr: usize,
9092    for  i in  curr..statements. len ( )  { 
9193        let  ref  statement = statements[ i] ; 
9294        let  StatementKind :: Assign ( _,  ref  rhs)  = statement. kind ; 
93-         if  let  & Rvalue :: Aggregate ( ref  kind,  ref  operands)  = rhs { 
94-             if  let  & AggregateKind :: Adt ( adt_def,  variant,  _)  = kind { 
95-                 if  operands. len ( )  > 0  {  // don't deaggregate () 
96-                     if  adt_def. variants . len ( )  > 1  { 
97-                         // only deaggrate structs for now 
98-                         continue ; 
99-                     } 
100-                     debug ! ( "getting variant {:?}" ,  variant) ; 
101-                     debug ! ( "for adt_def {:?}" ,  adt_def) ; 
102-                     let  variant_def = & adt_def. variants [ variant] ; 
103-                     if  variant_def. kind  == VariantKind :: Struct  { 
104-                         return  Some ( i) ; 
105-                     } 
106-                 } 
107-             } 
95+         let  ( kind,  operands)  = match  rhs { 
96+             & Rvalue :: Aggregate ( ref  kind,  ref  operands)  => ( kind,  operands) , 
97+             _ => continue , 
98+         } ; 
99+         let  ( adt_def,  variant)  = match  kind { 
100+             & AggregateKind :: Adt ( adt_def,  variant,  _)  => ( adt_def,  variant) , 
101+             _ => continue , 
102+         } ; 
103+         if  operands. len ( )  == 0  || adt_def. variants . len ( )  > 1  { 
104+             // don't deaggregate () 
105+             // don't deaggregate enums ... for now 
106+             continue ; 
107+         } 
108+         debug ! ( "getting variant {:?}" ,  variant) ; 
109+         debug ! ( "for adt_def {:?}" ,  adt_def) ; 
110+         let  variant_def = & adt_def. variants [ variant] ; 
111+         if  variant_def. kind  == VariantKind :: Struct  { 
112+             return  Some ( i) ; 
108113        } 
109114    } ; 
110115    None 
0 commit comments