From 87d5bd38ba209f8f25435060a7699bc8de687bda Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Loi=CC=88c=20Correnson?= <loic.correnson@cea.fr>
Date: Mon, 18 Jan 2021 16:30:41 +0100
Subject: [PATCH] [wp] use funbehavior in modes

---
 src/plugins/wp/cfgCalculus.ml  | 54 ++++++++++++++--------------------
 src/plugins/wp/cfgCalculus.mli |  2 +-
 2 files changed, 23 insertions(+), 33 deletions(-)

diff --git a/src/plugins/wp/cfgCalculus.ml b/src/plugins/wp/cfgCalculus.ml
index 7d8adf532b8..36985ad409a 100644
--- a/src/plugins/wp/cfgCalculus.ml
+++ b/src/plugins/wp/cfgCalculus.ml
@@ -40,48 +40,38 @@ type assigns = WpPropId.assigns_full_info
 (* -------------------------------------------------------------------------- *)
 
 type mode = {
-  bhv : string option ; (* Selected behavior (None is default) *)
+  bhv : funbehavior ; (* Selected behavior (None is default) *)
   stmt : stmt option ;  (* Stmt contract under proof *)
 }
 
-let default_mode = { bhv = None ; stmt = None }
-
 let get_modes kf =
-  default_mode ::
-  begin
-    Annotations.fold_behaviors
-      (fun _emitter b ms -> { bhv = Some b.b_name ; stmt = None } :: ms)
-      kf @@
-    List.fold_right
-      (fun stmt ms ->
-         Annotations.fold_code_annot (fun _emitter ca ms ->
-             match ca.annot_content with
-             | AStmtSpec(_, { spec_behavior = bs } ) ->
-                 { bhv = None ; stmt = Some stmt } ::
-                 List.fold_right (fun b ms -> {
-                       bhv = Some b.b_name ;
-                       stmt = Some stmt ;
-                     }::ms) bs ms
-             | _ -> ms
-           ) stmt ms
-      ) (Kernel_function.get_definition kf).sallstmts []
-  end
+  Annotations.fold_behaviors
+    (fun _emitter bhv ms -> { bhv ; stmt = None } :: ms)
+    kf @@
+  List.fold_right
+    (fun stmt ms ->
+       Annotations.fold_code_annot (fun _emitter ca ms ->
+           match ca.annot_content with
+           | AStmtSpec(_, { spec_behavior = bs } ) ->
+               List.fold_right (fun bhv ms -> {
+                     bhv ;
+                     stmt = Some stmt ;
+                   }::ms) bs ms
+           | _ -> ms
+         ) stmt ms
+    ) (Kernel_function.get_definition kf).sallstmts []
 
 (* -------------------------------------------------------------------------- *)
 (* --- Property Selection by Mode                                         --- *)
 (* -------------------------------------------------------------------------- *)
 
-let is_default (m: mode) = m.bhv = None
+let is_default_bhv (m: mode) = Cil.is_default_behavior m.bhv
 
 let is_selected_bhv (m: mode) (bhv: funbehavior) =
-  match m.bhv with
-  | None -> Cil.is_default_behavior bhv
-  | Some b -> b = bhv.b_name
+  m.bhv.b_name = bhv.b_name
 
 let is_selected_for (m: mode) (fors: string list) =
-  match m.bhv with
-  | None -> fors = []
-  | Some b0 -> List.mem b0 fors
+  List.mem m.bhv.b_name fors
 
 let is_selected_ca ~goal (m: mode) (ca: code_annotation) =
   match ca.annot_content with
@@ -90,7 +80,7 @@ let is_selected_ca ~goal (m: mode) (ca: code_annotation) =
   | AAssert(forb,_)
   | AInvariant(forb,_,_)
     ->  not goal || is_selected_for m forb
-  | AVariant _ -> m.bhv = None
+  | AVariant _ -> is_default_bhv m
   | AExtended _ | AStmtSpec _ | APragma _ ->
       assert false (* n/a *)
 
@@ -103,14 +93,14 @@ let is_selected_property ~goal (m: mode) (p: Property.t) =
         | PKRequires bhv | PKAssumes bhv ->
             Cil.is_default_behavior bhv || is_selected_bhv m bhv
         | PKEnsures(bhv,_) -> is_selected_bhv m bhv
-        | PKTerminates -> is_default m
+        | PKTerminates -> is_default_bhv m
       end
   | IPAllocation { ial_bhv = bhv } | IPAssigns { ias_bhv = bhv } ->
       begin match bhv with
         | Id_loop ca -> is_selected_ca ~goal m ca
         | Id_contract(_,bhv) -> is_selected_bhv m bhv
       end
-  | IPDecrease { id_ca = None } -> is_default m
+  | IPDecrease { id_ca = None } -> is_default_bhv m
   | IPDecrease { id_ca = Some ca } -> is_selected_ca ~goal m ca
   | IPComplete _ | IPDisjoint _ | IPFrom _
   | IPGlobalInvariant _ | IPTypeInvariant _ ->
diff --git a/src/plugins/wp/cfgCalculus.mli b/src/plugins/wp/cfgCalculus.mli
index 9765f7b66a4..34ebd0a1fa9 100644
--- a/src/plugins/wp/cfgCalculus.mli
+++ b/src/plugins/wp/cfgCalculus.mli
@@ -27,7 +27,7 @@ open Cil_types
 (* -------------------------------------------------------------------------- *)
 
 type mode = {
-  bhv : string option ; (* Selected behavior (None is default) *)
+  bhv : funbehavior ; (* Selected behavior (None is default) *)
   stmt : stmt option ;  (* Stmt contract under proof *)
 }
 
-- 
GitLab