From f2e883b55a309f6ccef95bc4e8cd0015bfbef1d9 Mon Sep 17 00:00:00 2001
From: Virgile Prevosto <virgile.prevosto@m4x.org>
Date: Thu, 10 Mar 2022 14:22:43 +0100
Subject: [PATCH] [kernel] \exit_status is a special case for ast diff

---
 src/kernel_services/ast_queries/ast_diff.ml | 25 ++++++++++++++++++++-
 tests/syntax/ast_diff_1.i                   |  1 +
 tests/syntax/ast_diff_2.i                   |  1 +
 3 files changed, 26 insertions(+), 1 deletion(-)

diff --git a/src/kernel_services/ast_queries/ast_diff.ml b/src/kernel_services/ast_queries/ast_diff.ml
index 1f4c46afdf4..5041723291b 100644
--- a/src/kernel_services/ast_queries/ast_diff.ml
+++ b/src/kernel_services/ast_queries/ast_diff.ml
@@ -646,9 +646,22 @@ and is_matching_logic_var lv lv' env =
      | None ->
        (match Logic_var.find lv with
         | `Not_present -> false
-        | `Same lv'' -> Cil_datatype.Logic_var.equal lv' lv''))
+        | `Same lv'' -> Cil_datatype.Logic_var.equal lv' lv''
+        | exception Not_found ->
+          if lv.lv_name = "\\exit_status" && lv'.lv_name = "\\exit_status"
+          then begin Logic_var.add lv (`Same lv'); true end
+          else begin
+            match logic_var_correspondance lv env with
+            | None -> false
+            | Some lv'' -> Cil_datatype.Logic_var.equal lv' lv''
+          end))
   | _ -> false
 
+and logic_var_correspondance lv env =
+  match find_candidate_logic_var lv env with
+  | None -> None
+  | Some lv' -> Logic_var.add lv (`Same lv'); Some lv'
+
 and is_same_term_offset lo lo' env =
   match lo, lo' with
   | TNoOffset, TNoOffset -> true
@@ -1212,6 +1225,16 @@ and logic_vars_env l l' env =
   else
     false, env
 
+and find_candidate_logic_var ?loc:_loc lv env =
+  let candidates = Logic_env.find_all_logic_functions lv.lv_name in
+  match List.find_opt (fun li -> li.l_profile = []) candidates with
+  | None -> Format.printf "No such var@."; None
+  | Some li ->
+    Format.printf "Found something@.";
+    if is_same_logic_var lv li.l_var_info env then
+      Some li.l_var_info
+    else None
+
 (* because of overloading, we have to check for a corresponding profile,
    leading to potentially recursive calls to is_same_* functions. *)
 and find_candidate_logic_info ?loc:_loc li env =
diff --git a/tests/syntax/ast_diff_1.i b/tests/syntax/ast_diff_1.i
index 039e389d5e2..4858468ec5f 100644
--- a/tests/syntax/ast_diff_1.i
+++ b/tests/syntax/ast_diff_1.i
@@ -45,6 +45,7 @@ int has_static_local(void) {
   return x;
 }
 
+/*@ exits \exit_status == 1; */
 int decl(void);
 
 int used_in_decl;
diff --git a/tests/syntax/ast_diff_2.i b/tests/syntax/ast_diff_2.i
index 3f9558f852f..094bee8d12c 100644
--- a/tests/syntax/ast_diff_2.i
+++ b/tests/syntax/ast_diff_2.i
@@ -46,6 +46,7 @@ int has_static_local(void) {
 
 int used_in_decl;
 
+/*@ exits \exit_status == 1; */
 int decl() {
   used_in_decl++;
   return used_in_decl;
-- 
GitLab