@@ -792,26 +792,37 @@ macro_rules! visit_place_fns {
792792 ) {
793793 self . visit_place_base( & mut place. base, context, location) ;
794794
795- place. projection = self . process_projection( & place. projection) ;
795+ if let Some ( new_projection) = self . process_projection( & place. projection) {
796+ place. projection = new_projection;
797+ }
796798 }
797799
798800 fn process_projection(
799801 & mut self ,
800- projection: & Box <[ PlaceElem <' tcx>] >,
801- ) -> Box <[ PlaceElem <' tcx>] > {
802- let new_projection: Vec <_> = projection. iter( ) . map( |elem|
803- self . process_projection_elem( elem)
804- ) . collect( ) ;
802+ projection: & ' a [ PlaceElem <' tcx>] ,
803+ ) -> Option <Box <[ PlaceElem <' tcx>] >> {
804+ let mut projection = Cow :: Borrowed ( projection) ;
805+
806+ for i in 0 ..projection. len( ) {
807+ if let Some ( elem) = projection. get( i) {
808+ if let Cow :: Owned ( elem) = self . process_projection_elem( Cow :: Borrowed ( elem) ) {
809+ let vec = projection. to_mut( ) ;
810+ vec[ i] = elem;
811+ }
812+ }
813+ }
805814
806- new_projection. into_boxed_slice( )
815+ match projection {
816+ Cow :: Borrowed ( _) => None ,
817+ Cow :: Owned ( vec) => Some ( vec. into_boxed_slice( ) ) ,
818+ }
807819 }
808820
809821 fn process_projection_elem(
810822 & mut self ,
811- elem: & PlaceElem <' tcx>,
812- ) -> PlaceElem <' tcx> {
813- // FIXME: avoid cloning here
814- elem. clone( )
823+ elem: Cow <' a, PlaceElem <' tcx>>,
824+ ) -> Cow <' a, PlaceElem <' tcx>> {
825+ elem
815826 }
816827 ) ;
817828
0 commit comments