Skip to content

Commit 90ef605

Browse files
committed
allow multiple assigns clauses
This changes the parser to allow multiple assigns clauses in a contract. The meaning of multiple clauses is the same as the meaning of one clause that contains the concatenation of the target lists of the given clauses.
1 parent 10ddca0 commit 90ef605

File tree

2 files changed

+17
-6
lines changed

2 files changed

+17
-6
lines changed

regression/contracts/assigns_enforce_03/main.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ void f2(int *x2, int *y2, int *z2) __CPROVER_assigns(*x2, *y2, *z2)
88
f3(x2, y2, z2);
99
}
1010

11-
void f3(int *x3, int *y3, int *z3) __CPROVER_assigns(*x3, *y3, *z3)
11+
void f3(int *x3, int *y3, int *z3) __CPROVER_assigns(*x3) __CPROVER_assigns(*y3)
12+
__CPROVER_assigns(*z3)
1213
{
1314
*x3 = *x3 + 1;
1415
*y3 = *y3 + 1;

src/ansi-c/parser.y

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2437,7 +2437,7 @@ declaration_or_expression_statement:
24372437

24382438
iteration_statement:
24392439
TOK_WHILE '(' comma_expression_opt ')'
2440-
cprover_contract_assigns_opt
2440+
cprover_contract_assigns_list_opt
24412441
cprover_contract_loop_invariant_list_opt
24422442
cprover_contract_decreases_opt
24432443
statement
@@ -2453,7 +2453,7 @@ iteration_statement:
24532453
parser_stack($$).add(ID_C_spec_decreases).swap(parser_stack($7));
24542454
}
24552455
| TOK_DO statement TOK_WHILE '(' comma_expression ')'
2456-
cprover_contract_assigns_opt
2456+
cprover_contract_assigns_list_opt
24572457
cprover_contract_loop_invariant_list_opt
24582458
cprover_contract_decreases_opt ';'
24592459
{
@@ -2479,7 +2479,7 @@ iteration_statement:
24792479
'(' declaration_or_expression_statement
24802480
comma_expression_opt ';'
24812481
comma_expression_opt ')'
2482-
cprover_contract_assigns_opt
2482+
cprover_contract_assigns_list_opt
24832483
cprover_contract_loop_invariant_list_opt
24842484
cprover_contract_decreases_opt
24852485
statement
@@ -3297,10 +3297,20 @@ cprover_contract_assigns:
32973297
}
32983298
;
32993299

3300-
cprover_contract_assigns_opt:
3300+
cprover_contract_assigns_list:
3301+
cprover_contract_assigns
3302+
| cprover_contract_assigns_list cprover_contract_assigns
3303+
{
3304+
$$=$1;
3305+
for(auto &target : parser_stack($2).operands())
3306+
parser_stack($$).add_to_operands(std::move(target));
3307+
}
3308+
;
3309+
3310+
cprover_contract_assigns_list_opt:
33013311
/* nothing */
33023312
{ init($$); parser_stack($$).make_nil(); }
3303-
| cprover_contract_assigns
3313+
| cprover_contract_assigns_list
33043314
;
33053315

33063316
cprover_function_contract_sequence:

0 commit comments

Comments
 (0)