@@ -1004,13 +1004,12 @@ void goto_convertt::convert_assume(
10041004
10051005void goto_convertt::convert_loop_contracts (
10061006 const codet &code,
1007- goto_programt::targett loop,
1008- const irep_idt &mode)
1007+ goto_programt::targett loop)
10091008{
10101009 auto assigns = static_cast <const unary_exprt &>(code.find (ID_C_spec_assigns));
10111010 if (assigns.is_not_nil ())
10121011 {
1013- PRECONDITION (loop->is_goto ());
1012+ PRECONDITION (loop->is_goto () || loop-> is_incomplete_goto () );
10141013 loop->condition_nonconst ().add (ID_C_spec_assigns).swap (assigns.op ());
10151014 }
10161015
@@ -1024,7 +1023,7 @@ void goto_convertt::convert_loop_contracts(
10241023 " Loop invariant is not side-effect free." , code.find_source_location ());
10251024 }
10261025
1027- PRECONDITION (loop->is_goto ());
1026+ PRECONDITION (loop->is_goto () || loop-> is_incomplete_goto () );
10281027 loop->condition_nonconst ().add (ID_C_spec_loop_invariant).swap (invariant);
10291028 }
10301029
@@ -1039,7 +1038,7 @@ void goto_convertt::convert_loop_contracts(
10391038 code.find_source_location ());
10401039 }
10411040
1042- PRECONDITION (loop->is_goto ());
1041+ PRECONDITION (loop->is_goto () || loop-> is_incomplete_goto () );
10431042 loop->condition_nonconst ().add (ID_C_spec_decreases).swap (decreases_clause);
10441043 }
10451044}
@@ -1123,7 +1122,7 @@ void goto_convertt::convert_for(
11231122 goto_programt::make_goto (u, true_exprt (), code.source_location ()));
11241123
11251124 // assigns clause, loop invariant and decreases clause
1126- convert_loop_contracts (code, y, mode );
1125+ convert_loop_contracts (code, y);
11271126
11281127 dest.destructive_append (sideeffects);
11291128 dest.destructive_append (tmp_v);
@@ -1181,7 +1180,7 @@ void goto_convertt::convert_while(
11811180 convert (code.body (), tmp_x, mode);
11821181
11831182 // assigns clause, loop invariant and decreases clause
1184- convert_loop_contracts (code, y, mode );
1183+ convert_loop_contracts (code, y);
11851184
11861185 dest.destructive_append (tmp_branch);
11871186 dest.destructive_append (tmp_x);
@@ -1250,7 +1249,7 @@ void goto_convertt::convert_dowhile(
12501249 y->complete_goto (w);
12511250
12521251 // assigns_clause, loop invariant and decreases clause
1253- convert_loop_contracts (code, y, mode );
1252+ convert_loop_contracts (code, y);
12541253
12551254 dest.destructive_append (tmp_w);
12561255 dest.destructive_append (sideeffects);
@@ -1512,6 +1511,9 @@ void goto_convertt::convert_goto(const code_gotot &code, goto_programt &dest)
15121511 goto_programt::targett t =
15131512 dest.add (goto_programt::make_incomplete_goto (code, code.source_location ()));
15141513
1514+ // Loop contracts annotated in GOTO
1515+ convert_loop_contracts (code, t);
1516+
15151517 // remember it to do the target later
15161518 targets.gotos .emplace_back (t, targets.scope_stack .get_current_node ());
15171519}
0 commit comments