From 1376b82108080384a00c1954c94a3fc9ceaef00c Mon Sep 17 00:00:00 2001
From: Basile Desloges <basile.desloges@cea.fr>
Date: Tue, 13 Jul 2021 16:59:07 +0200
Subject: [PATCH] [eacsl] Use `predicate_to_exp` instead of building directly
 an expression

---
 src/plugins/e-acsl/src/code_generator/loops.ml | 17 +++++++++++++----
 1 file changed, 13 insertions(+), 4 deletions(-)

diff --git a/src/plugins/e-acsl/src/code_generator/loops.ml b/src/plugins/e-acsl/src/code_generator/loops.ml
index 656f790c6b0..9e5d2e827ee 100644
--- a/src/plugins/e-acsl/src/code_generator/loops.ml
+++ b/src/plugins/e-acsl/src/code_generator/loops.ml
@@ -118,14 +118,23 @@ let handle_annotations env kf stmt =
             stmts, env
           | Some (t, e_old, None) ->
             let env = Env.push env in
-            Typing.type_term ~use_gmp_opt:true t;
-            let e, env = !term_to_exp_ref kf env t in
+            let t_old = Logic_utils.expr_to_term e_old in
+            let variant_pos =
+              Logic_const.prel ~loc (Rge, t_old, Logic_const.tinteger ~loc 0)
+            in
+            Typing.type_named_predicate ~must_clear:true variant_pos;
+            let variant_pos_e, env = !predicate_to_exp_ref kf env variant_pos in
             let msg1 =
               Format.asprintf
                 "(old %a) %a 0"
                 Printer.pp_term t
                 Printer.pp_relation Rge
             in
+            let variant_dec =
+              Logic_const.prel ~loc (Rgt, t_old, t)
+            in
+            Typing.type_named_predicate ~must_clear:true variant_dec;
+            let variant_dec_e, env = !predicate_to_exp_ref kf env variant_dec in
             let msg2 =
               Format.asprintf
                 "(old %a) > %a"
@@ -140,14 +149,14 @@ let handle_annotations env kf stmt =
                   ~pred_kind:Assert
                   Smart_stmt.Variant
                   kf
-                  (Cil.mkBinOp ~loc Ge e_old (Cil.zero ~loc));
+                  variant_pos_e;
                 Smart_stmt.runtime_check_with_msg
                   ~loc
                   msg2
                   ~pred_kind:Assert
                   Smart_stmt.Variant
                   kf
-                  (Cil.mkBinOp ~loc Gt e_old e)
+                  variant_dec_e
               ]
             in
             let blk, env =
-- 
GitLab