@@ -200,7 +200,6 @@ pub fn lower_for_loop(
200200 } ;
201201 let next_value_type = some_variant. ty ;
202202 builder. update_ref ( ctx, & loop_expr. into_iter_member_path , next_iterator. var_id ) ;
203- let pattern = ctx. function_body . arenas . patterns [ loop_expr. pattern ] . clone ( ) ;
204203 let unit_ty = corelib:: unit_ty ( db) ;
205204 let some_block: cairo_lang_semantic:: ExprBlock =
206205 extract_matches ! ( & ctx. function_body. arenas. exprs[ loop_expr. body] , semantic:: Expr :: Block )
@@ -215,7 +214,8 @@ pub fn lower_for_loop(
215214 var_id : some_var_id,
216215 location : ctx. get_location ( some_block. stable_ptr . untyped ( ) ) ,
217216 } ) ;
218- let lowered_pattern = lower_single_pattern ( ctx, & mut some_subscope, pattern, variant_expr) ;
217+ let lowered_pattern =
218+ lower_single_pattern ( ctx, & mut some_subscope, loop_expr. pattern , variant_expr) ;
219219 let sealed_some = match lowered_pattern {
220220 Ok ( _) => {
221221 let block_expr = ( || {
@@ -651,8 +651,7 @@ pub fn lower_statement(
651651 semantic:: Statement :: Let ( semantic:: StatementLet { pattern, expr, stable_ptr : _ } ) => {
652652 log:: trace!( "Lowering a let statement." ) ;
653653 let lowered_expr = lower_expr ( ctx, builder, * expr) ?;
654- let pattern = ctx. function_body . arenas . patterns [ * pattern] . clone ( ) ;
655- lower_single_pattern ( ctx, builder, pattern, lowered_expr) ?
654+ lower_single_pattern ( ctx, builder, * pattern, lowered_expr) ?
656655 }
657656 semantic:: Statement :: Continue ( semantic:: StatementContinue { stable_ptr } ) => {
658657 log:: trace!( "Lowering a continue statement." ) ;
@@ -698,24 +697,26 @@ pub fn lower_statement(
698697fn lower_single_pattern (
699698 ctx : & mut LoweringContext < ' _ , ' _ > ,
700699 builder : & mut BlockBuilder ,
701- pattern : semantic:: Pattern ,
700+ pattern_id : semantic:: PatternId ,
702701 lowered_expr : LoweredExpr ,
703702) -> Result < ( ) , LoweringFlowError > {
704703 log:: trace!( "Lowering a single pattern." ) ;
704+ let pattern = & ctx. function_body . arenas . patterns [ pattern_id] ;
705705 match pattern {
706706 semantic:: Pattern :: Literal ( _)
707707 | semantic:: Pattern :: StringLiteral ( _)
708708 | semantic:: Pattern :: EnumVariant ( _) => {
709709 return Err ( LoweringFlowError :: Failed (
710- ctx. diagnostics . report ( & pattern, UnsupportedPattern ) ,
710+ ctx. diagnostics . report ( pattern. stable_ptr ( ) , UnsupportedPattern ) ,
711711 ) ) ;
712712 }
713713 semantic:: Pattern :: Variable ( semantic:: PatternVariable {
714714 name : _,
715715 var : sem_var,
716716 stable_ptr,
717717 } ) => {
718- let sem_var = semantic:: Binding :: LocalVar ( sem_var) ;
718+ let sem_var = semantic:: Binding :: LocalVar ( sem_var. clone ( ) ) ;
719+ let stable_ptr = * stable_ptr;
719720 // Deposit the owned variable in the semantic variables store.
720721 let var = lowered_expr. as_var_usage ( ctx, builder) ?. var_id ;
721722 // Override variable location.
@@ -730,23 +731,25 @@ fn lower_single_pattern(
730731 . concrete_struct_members ( structure. concrete_struct_id )
731732 . map_err ( LoweringFlowError :: Failed ) ?;
732733 let mut required_members = UnorderedHashMap :: < _ , _ > :: from_iter (
733- structure. field_patterns . iter ( ) . map ( |( member, pattern) | ( member. id , pattern) ) ,
734+ structure. field_patterns . iter ( ) . map ( |( member, pattern) | ( member. id , * pattern) ) ,
734735 ) ;
736+ let n_snapshots = structure. n_snapshots ;
737+ let stable_ptr = structure. stable_ptr . untyped ( ) ;
735738 let generator = generators:: StructDestructure {
736739 input : lowered_expr. as_var_usage ( ctx, builder) ?,
737740 var_reqs : members
738741 . iter ( )
739742 . map ( |( _, member) | VarRequest {
740- ty : wrap_in_snapshots ( ctx. db , member. ty , structure . n_snapshots ) ,
743+ ty : wrap_in_snapshots ( ctx. db , member. ty , n_snapshots) ,
741744 location : ctx. get_location (
742745 required_members
743746 . get ( & member. id )
744747 . map ( |pattern| {
745- ctx. function_body . arenas . patterns [ * * pattern]
748+ ctx. function_body . arenas . patterns [ * pattern]
746749 . stable_ptr ( )
747750 . untyped ( )
748751 } )
749- . unwrap_or_else ( || structure . stable_ptr . untyped ( ) ) ,
752+ . unwrap_or_else ( || stable_ptr) ,
750753 ) ,
751754 } )
752755 . collect ( ) ,
@@ -755,8 +758,7 @@ fn lower_single_pattern(
755758 izip ! ( generator. add( ctx, & mut builder. statements) , members. iter( ) )
756759 {
757760 if let Some ( member_pattern) = required_members. remove ( & member. id ) {
758- let member_pattern = ctx. function_body . arenas . patterns [ * member_pattern] . clone ( ) ;
759- let stable_ptr = member_pattern. stable_ptr ( ) ;
761+ let stable_ptr = ctx. function_body . arenas . patterns [ member_pattern] . stable_ptr ( ) ;
760762 lower_single_pattern (
761763 ctx,
762764 builder,
@@ -777,11 +779,13 @@ fn lower_single_pattern(
777779 ty,
778780 ..
779781 } ) => {
780- lower_tuple_like_pattern_helper ( ctx, builder, lowered_expr, & patterns, ty) ?;
782+ let patterns = patterns. clone ( ) ;
783+ lower_tuple_like_pattern_helper ( ctx, builder, lowered_expr, & patterns, * ty) ?;
781784 }
782785 semantic:: Pattern :: Otherwise ( pattern) => {
786+ let stable_ptr = pattern. stable_ptr . untyped ( ) ;
783787 let var = lowered_expr. as_var_usage ( ctx, builder) ?. var_id ;
784- ctx. variables . variables [ var] . location = ctx. get_location ( pattern . stable_ptr . untyped ( ) ) ;
788+ ctx. variables . variables [ var] . location = ctx. get_location ( stable_ptr) ;
785789 }
786790 semantic:: Pattern :: Missing ( _) => unreachable ! ( "Missing pattern in semantic model." ) ,
787791 }
@@ -840,12 +844,7 @@ fn lower_tuple_like_pattern_helper(
840844 }
841845 } ;
842846 for ( var, pattern) in zip_eq ( outputs, patterns) {
843- lower_single_pattern (
844- ctx,
845- builder,
846- ctx. function_body . arenas . patterns [ * pattern] . clone ( ) ,
847- var,
848- ) ?;
847+ lower_single_pattern ( ctx, builder, * pattern, var) ?;
849848 }
850849 Ok ( ( ) )
851850}
0 commit comments