let get_loop_annots config vloop s =
let do_annot a (assigns, loop_entry, loop_back , loop_core as acc) =
let ca = match a with User ca | AI (_, ca) -> ca in
match ca.annot_content with
| AInvariant (b_list, true, inv) ->
add_loop_invariant_annot config vloop s ca b_list inv acc
| AVariant (var_exp, None) ->
let loop_entry, loop_back =
add_variant_annot config s ca var_exp loop_entry loop_back
in assigns, loop_entry , loop_back , loop_core
| AVariant (_v, _rel) ->
Wp_parameters.warning "Ignoring loop variant with measure : %a"
!Ast_printer.d_code_annotation ca;
acc
| AAssigns (_,WritesAny) -> assert false
| AAssigns (b_list, Writes a) ->
let h_assigns, g_assigns = assigns in
let check_assigns old cur =
match old with
None -> Some cur
| Some _ ->
Wp_parameters.fatal
"At most one loop assigns can be associated to a behavior"
in
let assigns =
match is_annot_for_config config vloop s b_list with
| TBRok | TBRpart ->
check_assigns h_assigns (ca,a), check_assigns g_assigns (ca,a)
| TBRhyp ->
check_assigns h_assigns (ca,a), g_assigns
| TBRno -> assigns
in (assigns, loop_entry , loop_back , loop_core)
| _ -> acc
in
let acc = ((None,None),
WpStrategy.empty_acc, WpStrategy.empty_acc, WpStrategy.empty_acc)
in
let (h_assigns, g_assigns), loop_entry , loop_back , loop_core =
Annotations.single_fold_stmt do_annot s acc
in
let loop_back = match g_assigns with
| None -> loop_back
| Some a -> add_loop_assigns_goal config s a loop_back
in
let loop_core =
WpStrategy.add_loop_assigns_hyp loop_core config.kf s h_assigns
in (loop_entry , loop_back , loop_core)