@@ -158,6 +158,8 @@ pub fn simplify_program(mut program: Program) -> SimpleProgram {
158158 for ( name, func) in & program. functions {
159159 let mut array_manager = ArrayManager :: default ( ) ;
160160 let simplified_instructions = simplify_lines (
161+ & program. functions ,
162+ func. n_returned_vars ,
161163 & func. body ,
162164 & mut counters,
163165 & mut new_functions,
@@ -430,7 +432,10 @@ impl ArrayManager {
430432 }
431433}
432434
435+ #[ allow( clippy:: too_many_arguments) ]
433436fn simplify_lines (
437+ functions : & BTreeMap < String , Function > ,
438+ n_returned_vars : usize ,
434439 lines : & [ Line ] ,
435440 counters : & mut Counters ,
436441 new_functions : & mut BTreeMap < String , SimpleFunction > ,
@@ -450,6 +455,8 @@ fn simplify_lines(
450455 for ( i, ( pattern, statements) ) in arms. iter ( ) . enumerate ( ) {
451456 assert_eq ! ( * pattern, i, "match patterns should be consecutive, starting from 0" ) ;
452457 simple_arms. push ( simplify_lines (
458+ functions,
459+ n_returned_vars,
453460 statements,
454461 counters,
455462 new_functions,
@@ -601,6 +608,8 @@ fn simplify_lines(
601608
602609 let mut array_manager_then = array_manager. clone ( ) ;
603610 let then_branch_simplified = simplify_lines (
611+ functions,
612+ n_returned_vars,
604613 then_branch,
605614 counters,
606615 new_functions,
@@ -612,6 +621,8 @@ fn simplify_lines(
612621 array_manager_else. valid = array_manager. valid . clone ( ) ; // Crucial: remove the access added in the IF branch
613622
614623 let else_branch_simplified = simplify_lines (
624+ functions,
625+ n_returned_vars,
615626 else_branch,
616627 counters,
617628 new_functions,
@@ -661,6 +672,8 @@ fn simplify_lines(
661672 let mut body_copy = body. clone ( ) ;
662673 replace_vars_for_unroll ( & mut body_copy, iterator, unroll_index, i, & internal_variables) ;
663674 unrolled_lines. extend ( simplify_lines (
675+ functions,
676+ 0 ,
664677 & body_copy,
665678 counters,
666679 new_functions,
@@ -684,6 +697,8 @@ fn simplify_lines(
684697 let valid_aux_vars_in_array_manager_before = array_manager. valid . clone ( ) ;
685698 array_manager. valid . clear ( ) ;
686699 let simplified_body = simplify_lines (
700+ functions,
701+ 0 ,
687702 body,
688703 counters,
689704 new_functions,
@@ -758,6 +773,16 @@ fn simplify_lines(
758773 return_data,
759774 line_number,
760775 } => {
776+ let function = functions
777+ . get ( function_name)
778+ . expect ( "Function used but not defined: {function_name}" ) ;
779+ if return_data. len ( ) != function. n_returned_vars {
780+ panic ! (
781+ "Expected {} returned vars in call to {function_name}" ,
782+ function. n_returned_vars
783+ ) ;
784+ }
785+
761786 let simplified_args = args
762787 . iter ( )
763788 . map ( |arg| simplify_expr ( arg, & mut res, counters, array_manager, const_malloc) )
@@ -771,6 +796,11 @@ fn simplify_lines(
771796 }
772797 Line :: FunctionRet { return_data } => {
773798 assert ! ( !in_a_loop, "Function return inside a loop is not currently supported" ) ;
799+ assert ! (
800+ return_data. len( ) == n_returned_vars,
801+ "Wrong number of return values in return statement; expected {n_returned_vars} but got {}" ,
802+ return_data. len( )
803+ ) ;
774804 let simplified_return_data = return_data
775805 . iter ( )
776806 . map ( |ret| simplify_expr ( ret, & mut res, counters, array_manager, const_malloc) )
0 commit comments