@@ -432,8 +432,25 @@ void goto_convertt::optimize_guarded_gotos(goto_programt &dest)
432
432
// cannot compare iterators, so compare target number instead
433
433
if (it->get_target ()->target_number == it_z->target_number )
434
434
{
435
+ DATA_INVARIANT (
436
+ it->condition ().find (ID_C_spec_assigns).is_nil () &&
437
+ it->condition ().find (ID_C_spec_loop_invariant).is_nil () &&
438
+ it->condition ().find (ID_C_spec_decreases).is_nil (),
439
+ " no loop invariant expected" );
440
+ irept y_assigns = it_goto_y->condition ().find (ID_C_spec_assigns);
441
+ irept y_loop_invariant =
442
+ it_goto_y->condition ().find (ID_C_spec_loop_invariant);
443
+ irept y_decreases = it_goto_y->condition ().find (ID_C_spec_decreases);
444
+
435
445
it->set_target (it_goto_y->get_target ());
436
- it->condition_nonconst () = boolean_negate (it->condition ());
446
+ exprt updated_condition = boolean_negate (it->condition ());
447
+ if (y_assigns.is_not_nil ())
448
+ updated_condition.add (ID_C_spec_assigns).swap (y_assigns);
449
+ if (y_loop_invariant.is_not_nil ())
450
+ updated_condition.add (ID_C_spec_loop_invariant).swap (y_loop_invariant);
451
+ if (y_decreases.is_not_nil ())
452
+ updated_condition.add (ID_C_spec_decreases).swap (y_decreases);
453
+ it->condition_nonconst () = updated_condition;
437
454
it_goto_y->turn_into_skip ();
438
455
}
439
456
}
@@ -1301,7 +1318,7 @@ void goto_convertt::convert_dowhile(
1301
1318
W->complete_goto (w);
1302
1319
1303
1320
// assigns_clause, loop invariant and decreases clause
1304
- convert_loop_contracts (code, y );
1321
+ convert_loop_contracts (code, W );
1305
1322
1306
1323
dest.destructive_append (tmp_w);
1307
1324
dest.destructive_append (side_effects.side_effects );
0 commit comments