@@ -467,22 +467,22 @@ impl<'a, 'mir, 'tcx, M: Machine<'a, 'mir, 'tcx>> InterpretCx<'a, 'mir, 'tcx, M>
467467 mir_place : & mir:: Place < ' tcx > ,
468468 layout : Option < TyLayout < ' tcx > > ,
469469 ) -> EvalResult < ' tcx , OpTy < ' tcx , M :: PointerTag > > {
470- use rustc:: mir:: Place :: * ;
471470 use rustc:: mir:: PlaceBase ;
472- let op = match * mir_place {
473- Base ( PlaceBase :: Local ( mir:: RETURN_PLACE ) ) => return err ! ( ReadFromReturnPointer ) ,
474- Base ( PlaceBase :: Local ( local) ) => self . access_local ( self . frame ( ) , local, layout) ?,
475471
476- Projection ( ref proj) => {
477- let op = self . eval_place_to_op ( & proj. base , None ) ?;
478- self . operand_projection ( op, & proj. elem ) ?
479- }
472+ mir_place. iterate ( |place_base, place_projection| {
473+ let mut op = match place_base {
474+ PlaceBase :: Local ( mir:: RETURN_PLACE ) => return err ! ( ReadFromReturnPointer ) ,
475+ PlaceBase :: Local ( local) => self . access_local ( self . frame ( ) , * local, layout) ?,
476+ _ => self . eval_place_to_mplace ( mir_place) ?. into ( ) ,
477+ } ;
480478
481- _ => self . eval_place_to_mplace ( mir_place) ?. into ( ) ,
482- } ;
479+ for proj in place_projection {
480+ op = self . operand_projection ( op, & proj. elem ) ?
481+ }
483482
484- trace ! ( "eval_place_to_op: got {:?}" , * op) ;
485- Ok ( op)
483+ trace ! ( "eval_place_to_op: got {:?}" , op) ;
484+ Ok ( op)
485+ } )
486486 }
487487
488488 /// Evaluate the operand, returning a place where you can then find the data.
0 commit comments