@@ -491,11 +491,22 @@ quantifier_expression:
491
491
}
492
492
;
493
493
494
- loop_invariant_opt :
494
+ loop_invariant :
495
+ TOK_CPROVER_LOOP_INVARIANT ' (' ACSL_binding_expression ' )'
496
+ { $$ =$3 ; }
497
+ ;
498
+
499
+ loop_invariant_list :
500
+ loop_invariant
501
+ { init($$ ); mto($$ , $1 ); }
502
+ | loop_invariant_list loop_invariant
503
+ { $$ =$1 ; mto($$ , $2 ); }
504
+ ;
505
+
506
+ loop_invariant_list_opt :
495
507
/* nothing */
496
508
{ init($$ ); parser_stack($$ ).make_nil(); }
497
- | TOK_CPROVER_LOOP_INVARIANT ' (' ACSL_binding_expression ' )'
498
- { $$ =$3 ; }
509
+ | loop_invariant_list
499
510
;
500
511
501
512
cprover_decreases_opt :
@@ -2426,28 +2437,28 @@ declaration_or_expression_statement:
2426
2437
2427
2438
iteration_statement:
2428
2439
TOK_WHILE ' (' comma_expression_opt ' )'
2429
- loop_invariant_opt cprover_decreases_opt
2440
+ loop_invariant_list_opt cprover_decreases_opt
2430
2441
statement
2431
2442
{
2432
2443
$$=$1 ;
2433
2444
statement ($$, ID_while);
2434
2445
parser_stack ($$).add_to_operands (std::move (parser_stack ($3 )), std::move (parser_stack ($7 )));
2435
2446
2436
- if (parser_stack ($5 ).is_not_nil ())
2437
- parser_stack ($$).add (ID_C_spec_loop_invariant). swap (parser_stack ($5 ));
2447
+ if (! parser_stack ($5 ).operands (). empty ())
2448
+ static_cast <exprt &>( parser_stack ($$).add (ID_C_spec_loop_invariant)). operands (). swap (parser_stack ($5 ). operands ( ));
2438
2449
2439
2450
if (parser_stack ($6 ).is_not_nil ())
2440
2451
parser_stack ($$).add (ID_C_spec_decreases).swap (parser_stack ($6 ));
2441
2452
}
2442
2453
| TOK_DO statement TOK_WHILE ' (' comma_expression ' )'
2443
- loop_invariant_opt cprover_decreases_opt ' ;'
2454
+ loop_invariant_list_opt cprover_decreases_opt ' ;'
2444
2455
{
2445
2456
$$=$1 ;
2446
2457
statement ($$, ID_dowhile);
2447
2458
parser_stack ($$).add_to_operands (std::move (parser_stack ($5 )), std::move (parser_stack ($2 )));
2448
2459
2449
- if (parser_stack ($7 ).is_not_nil ())
2450
- parser_stack ($$).add (ID_C_spec_loop_invariant). swap (parser_stack ($7 ));
2460
+ if (! parser_stack ($7 ).operands (). empty ())
2461
+ static_cast <exprt &>( parser_stack ($$).add (ID_C_spec_loop_invariant)). operands (). swap (parser_stack ($7 ). operands ( ));
2451
2462
2452
2463
if (parser_stack ($8 ).is_not_nil ())
2453
2464
parser_stack ($$).add (ID_C_spec_decreases).swap (parser_stack ($8 ));
@@ -2464,7 +2475,7 @@ iteration_statement:
2464
2475
' (' declaration_or_expression_statement
2465
2476
comma_expression_opt ' ;'
2466
2477
comma_expression_opt ' )'
2467
- loop_invariant_opt cprover_decreases_opt
2478
+ loop_invariant_list_opt cprover_decreases_opt
2468
2479
statement
2469
2480
{
2470
2481
$$=$1 ;
@@ -2475,8 +2486,8 @@ iteration_statement:
2475
2486
mto ($$, $7 );
2476
2487
mto ($$, $11 );
2477
2488
2478
- if (parser_stack ($9 ).is_not_nil ())
2479
- parser_stack ($$).add (ID_C_spec_loop_invariant). swap (parser_stack ($9 ));
2489
+ if (! parser_stack ($9 ).operands (). empty ())
2490
+ static_cast <exprt &>( parser_stack ($$).add (ID_C_spec_loop_invariant)). operands (). swap (parser_stack ($9 ). operands ( ));
2480
2491
2481
2492
if (parser_stack ($10 ).is_not_nil ())
2482
2493
parser_stack ($$).add (ID_C_spec_decreases).swap (parser_stack ($10 ));
0 commit comments