Skip to content

Commit 0a1bb6f

Browse files
qinhepingtautschnig
authored andcommitted
Allow loop contracts annotated to GOTO statement
1 parent bc46c88 commit 0a1bb6f

File tree

2 files changed

+11
-12
lines changed

2 files changed

+11
-12
lines changed

src/ansi-c/goto-conversion/goto_convert.cpp

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1004,13 +1004,12 @@ void goto_convertt::convert_assume(
10041004

10051005
void 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
}

src/ansi-c/goto-conversion/goto_convert_class.h

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -241,10 +241,7 @@ class goto_convertt : public messaget
241241
goto_programt &dest,
242242
const irep_idt &mode);
243243
void convert_cpp_delete(const codet &code, goto_programt &dest);
244-
void convert_loop_contracts(
245-
const codet &code,
246-
goto_programt::targett loop,
247-
const irep_idt &mode);
244+
void convert_loop_contracts(const codet &code, goto_programt::targett loop);
248245
void
249246
convert_for(const code_fort &code, goto_programt &dest, const irep_idt &mode);
250247
void convert_while(

0 commit comments

Comments
 (0)