File tree Expand file tree Collapse file tree 3 files changed +42
-0
lines changed
regression/contracts/history-invalid Expand file tree Collapse file tree 3 files changed +42
-0
lines changed Original file line number Diff line number Diff line change
1
+ #include <assert.h>
2
+
3
+ int foo (int x )
4
+ {
5
+ return x ;
6
+ }
7
+
8
+ int main ()
9
+ {
10
+ int i , n , x [10 ];
11
+ __CPROVER_assume (x [0 ] == x [9 ]);
12
+ while (i < n )
13
+ __CPROVER_loop_invariant (x [0 ] == __CPROVER_loop_entry (foo (x [0 ])))
14
+ {
15
+ x [0 ] = x [9 ] - 1 ;
16
+ x [0 ]++ ;
17
+ }
18
+ assert (x [0 ] == x [9 ]);
19
+ }
Original file line number Diff line number Diff line change
1
+ CORE
2
+ main.c
3
+ --apply-loop-contracts
4
+ ^main.c.* error: Tracking history of side_effect expressions is not supported yet.$
5
+ ^CONVERSION ERROR$
6
+ ^EXIT=(1|64)$
7
+ ^SIGNAL=0$
8
+ --
9
+ --
10
+ This test ensures that expressions with side effect, such as function calls,
11
+ may not be used in history variables.
Original file line number Diff line number Diff line change @@ -2732,6 +2732,18 @@ exprt c_typecheck_baset::do_special_functions(
2732
2732
throw 0 ;
2733
2733
}
2734
2734
2735
+ const auto ¶m_id = expr.arguments ().front ().id ();
2736
+ if (!(param_id == ID_dereference || param_id == ID_member ||
2737
+ param_id == ID_symbol || param_id == ID_ptrmember ||
2738
+ param_id == ID_constant || param_id == ID_typecast ||
2739
+ param_id == ID_index))
2740
+ {
2741
+ error ().source_location = f_op.source_location ();
2742
+ error () << " Tracking history of " << param_id
2743
+ << " expressions is not supported yet." << eom;
2744
+ throw 0 ;
2745
+ }
2746
+
2735
2747
irep_idt id = identifier == CPROVER_PREFIX " old" ? ID_old : ID_loop_entry;
2736
2748
2737
2749
history_exprt old_expr (expr.arguments ()[0 ], id);
You can’t perform that action at this time.
0 commit comments