From a7f9cc56cbddddb9e39f9680925a650c5124f549 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Loi=CC=88c=20Correnson?= <loic.correnson@cea.fr>
Date: Sat, 16 Jan 2021 13:23:53 +0100
Subject: [PATCH] [wp] fix loop contract ordering

---
 src/plugins/wp/wpAnnot.ml | 26 +++++++++++++++++++-------
 1 file changed, 19 insertions(+), 7 deletions(-)

diff --git a/src/plugins/wp/wpAnnot.ml b/src/plugins/wp/wpAnnot.ml
index 3afb903f313..61871bf069d 100644
--- a/src/plugins/wp/wpAnnot.ml
+++ b/src/plugins/wp/wpAnnot.ml
@@ -203,24 +203,36 @@ type loop_contract = {
   loop_assigns: WpPropId.assigns_full_info list;
 }
 
-let get_loop_contract kf stmt =
+let reverse_loop_contract l = {
+  loop_established = List.rev l.loop_established ;
+  loop_invariants = List.rev l.loop_invariants ;
+  loop_preserved = List.rev l.loop_preserved ;
+  loop_assigns = List.rev l.loop_assigns ;
+}
+
+let get_loop_contract kf stmt : loop_contract =
   let labels = NormAtLabels.labels_loop stmt in
   let normalize_pred p = NormAtLabels.preproc_annot labels p in
   let normalize_annot (i,p) = i, normalize_pred p in
   let normalize_assigns w = NormAtLabels.preproc_assigns labels w in
+  reverse_loop_contract @@
   Annotations.fold_code_annot
     begin fun _emitter ca l ->
       match ca.annot_content with
       | AInvariant(_,true,inv) ->
           let p = normalize_pred inv.tp_statement in
-          let g_hyp = WpPropId.mk_inv_hyp_id kf stmt ca in
           let g_est = WpPropId.mk_loop_inv_id kf stmt ~established:true ca in
           let g_ind = WpPropId.mk_loop_inv_id kf stmt ~established:false ca in
-          { l with
-            loop_established = (g_est,p) :: l.loop_established ;
-            loop_invariants = (g_hyp,p) :: l.loop_invariants ;
-            loop_preserved = (g_ind,p) :: l.loop_preserved ;
-          }
+          if inv.tp_only_check then
+            { l with
+              loop_established = (g_est,p) :: l.loop_established ;
+              loop_preserved   = (g_ind,p) :: l.loop_preserved }
+          else
+            let g_hyp = WpPropId.mk_inv_hyp_id kf stmt ca in
+            { l with
+              loop_established = (g_est,p) :: l.loop_established ;
+              loop_invariants  = (g_hyp,p) :: l.loop_invariants ;
+              loop_preserved   = (g_ind,p) :: l.loop_preserved }
       | AVariant(term, None) ->
           let vpos , vdec = WpStrategy.mk_variant_properties kf stmt ca term in
           { l with loop_preserved =
-- 
GitLab