@@ -1004,13 +1004,12 @@ void goto_convertt::convert_assume(
1004
1004
1005
1005
void goto_convertt::convert_loop_contracts (
1006
1006
const codet &code,
1007
- goto_programt::targett loop,
1008
- const irep_idt &mode)
1007
+ goto_programt::targett loop)
1009
1008
{
1010
1009
auto assigns = static_cast <const unary_exprt &>(code.find (ID_C_spec_assigns));
1011
1010
if (assigns.is_not_nil ())
1012
1011
{
1013
- PRECONDITION (loop->is_goto ());
1012
+ PRECONDITION (loop->is_goto () || loop-> is_incomplete_goto () );
1014
1013
loop->condition_nonconst ().add (ID_C_spec_assigns).swap (assigns.op ());
1015
1014
}
1016
1015
@@ -1024,7 +1023,7 @@ void goto_convertt::convert_loop_contracts(
1024
1023
" Loop invariant is not side-effect free." , code.find_source_location ());
1025
1024
}
1026
1025
1027
- PRECONDITION (loop->is_goto ());
1026
+ PRECONDITION (loop->is_goto () || loop-> is_incomplete_goto () );
1028
1027
loop->condition_nonconst ().add (ID_C_spec_loop_invariant).swap (invariant);
1029
1028
}
1030
1029
@@ -1039,7 +1038,7 @@ void goto_convertt::convert_loop_contracts(
1039
1038
code.find_source_location ());
1040
1039
}
1041
1040
1042
- PRECONDITION (loop->is_goto ());
1041
+ PRECONDITION (loop->is_goto () || loop-> is_incomplete_goto () );
1043
1042
loop->condition_nonconst ().add (ID_C_spec_decreases).swap (decreases_clause);
1044
1043
}
1045
1044
}
@@ -1123,7 +1122,7 @@ void goto_convertt::convert_for(
1123
1122
goto_programt::make_goto (u, true_exprt (), code.source_location ()));
1124
1123
1125
1124
// assigns clause, loop invariant and decreases clause
1126
- convert_loop_contracts (code, y, mode );
1125
+ convert_loop_contracts (code, y);
1127
1126
1128
1127
dest.destructive_append (sideeffects);
1129
1128
dest.destructive_append (tmp_v);
@@ -1181,7 +1180,7 @@ void goto_convertt::convert_while(
1181
1180
convert (code.body (), tmp_x, mode);
1182
1181
1183
1182
// assigns clause, loop invariant and decreases clause
1184
- convert_loop_contracts (code, y, mode );
1183
+ convert_loop_contracts (code, y);
1185
1184
1186
1185
dest.destructive_append (tmp_branch);
1187
1186
dest.destructive_append (tmp_x);
@@ -1250,7 +1249,7 @@ void goto_convertt::convert_dowhile(
1250
1249
y->complete_goto (w);
1251
1250
1252
1251
// assigns_clause, loop invariant and decreases clause
1253
- convert_loop_contracts (code, y, mode );
1252
+ convert_loop_contracts (code, y);
1254
1253
1255
1254
dest.destructive_append (tmp_w);
1256
1255
dest.destructive_append (sideeffects);
@@ -1512,6 +1511,9 @@ void goto_convertt::convert_goto(const code_gotot &code, goto_programt &dest)
1512
1511
goto_programt::targett t =
1513
1512
dest.add (goto_programt::make_incomplete_goto (code, code.source_location ()));
1514
1513
1514
+ // Loop contracts annotated in GOTO
1515
+ convert_loop_contracts (code, t);
1516
+
1515
1517
// remember it to do the target later
1516
1518
targets.gotos .emplace_back (t, targets.scope_stack .get_current_node ());
1517
1519
}
0 commit comments