From 475f9a906d412ecabfbc75e17d13da6c2923d8ab Mon Sep 17 00:00:00 2001
From: Allan Blanchard <allan.blanchard@cea.fr>
Date: Tue, 5 Nov 2019 16:07:16 +0100
Subject: [PATCH] [E-ACSL] Compatibility with ghost qualifier

---
 src/plugins/e-acsl/src/code_generator/injector.ml     | 9 +++++++--
 src/plugins/e-acsl/tests/constructs/ghost.i           | 4 ++--
 src/plugins/variadic/tests/declared/called_in_ghost.i | 3 ++-
 3 files changed, 11 insertions(+), 5 deletions(-)

diff --git a/src/plugins/e-acsl/src/code_generator/injector.ml b/src/plugins/e-acsl/src/code_generator/injector.ml
index 2422075600d..1939cabd184 100644
--- a/src/plugins/e-acsl/src/code_generator/injector.ml
+++ b/src/plugins/e-acsl/src/code_generator/injector.ml
@@ -568,9 +568,13 @@ let inject_in_fundec main fundec =
   let kf = try Globals.Functions.get vi with Not_found -> assert false in
   (* convert ghost variables *)
   vi.vghost <- false;
-  List.iter (fun vi -> vi.vghost <- false) fundec.slocals;
+  let unghost_local vi =
+    vi.vtype <- Cil.typeRemoveAttributesDeep ["ghost"] vi.vtype ;
+    vi.vghost <- false
+  in
+  List.iter unghost_local fundec.slocals;
   let unghost_formal vi =
-    vi.vghost <- false ;
+    unghost_local vi ;
     vi.vattr <- Cil.dropAttribute Cil.frama_c_ghost_formal vi.vattr
   in
   List.iter unghost_formal fundec.sformals;
@@ -602,6 +606,7 @@ let unghost_vi vi =
   (* do not convert extern ghost variables, because they can't be linked,
      see bts #1392 *)
   if vi.vstorage <> Extern then vi.vghost <- false;
+  vi.vtype <- Cil.typeRemoveAttributesDeep ["ghost"] vi.vtype ;
   match Cil.unrollType vi.vtype with
   | TFun(res, Some l, va, attr) ->
     (* unghostify function's parameters *)
diff --git a/src/plugins/e-acsl/tests/constructs/ghost.i b/src/plugins/e-acsl/tests/constructs/ghost.i
index 18ac737e975..9f76188f235 100644
--- a/src/plugins/e-acsl/tests/constructs/ghost.i
+++ b/src/plugins/e-acsl/tests/constructs/ghost.i
@@ -3,13 +3,13 @@
 */
 
 /*@ ghost int G = 0; */
-/*@ ghost int *P; */
+/*@ ghost int \ghost *P; */
 
 // /*@ ghost int foo(int *x) { return *x + 1; } */
 
 int main(void) {
   /*@ ghost P = &G; */ ;
-  /*@ ghost int *q = P; */
+  /*@ ghost int \ghost *q = P; */
   /*@ ghost (*P)++; */
   /*@ assert *q == G; */
   //  /*@ ghost G = foo(&G); */
diff --git a/src/plugins/variadic/tests/declared/called_in_ghost.i b/src/plugins/variadic/tests/declared/called_in_ghost.i
index 55261290115..7d6ccc4f7f6 100644
--- a/src/plugins/variadic/tests/declared/called_in_ghost.i
+++ b/src/plugins/variadic/tests/declared/called_in_ghost.i
@@ -1,6 +1,7 @@
 /* run.config
-   OPT: -load-script tests/declared/called_in_ghost.ml -print
+   OPT: -kernel-warn-key ghost:bad-use=inactive -load-script tests/declared/called_in_ghost.ml -print
 */
+// Note: we deactivate "ghost:bad-use" to check that printing goes right
 
 /*@ assigns \nothing ; */
 void function(int e, ...);
-- 
GitLab