From 7e1ca0b8c23e29c26e6e6fd50c8d9e3c72c774ea Mon Sep 17 00:00:00 2001
From: Thibaut Benjamin <thibaut.benjamin@gmail.com>
Date: Wed, 10 Aug 2022 18:02:08 +0200
Subject: [PATCH] [e-acsl] add support for functions returning rationals

---
 .../e-acsl/src/code_generator/logic_functions.ml     | 12 +++++++-----
 1 file changed, 7 insertions(+), 5 deletions(-)

diff --git a/src/plugins/e-acsl/src/code_generator/logic_functions.ml b/src/plugins/e-acsl/src/code_generator/logic_functions.ml
index a513853145e..791fcf4ee83 100644
--- a/src/plugins/e-acsl/src/code_generator/logic_functions.ml
+++ b/src/plugins/e-acsl/src/code_generator/logic_functions.ml
@@ -105,7 +105,7 @@ let pred_to_block ~loc kf env ret_vi p =
   generate_return_block ~loc env ret_vi e
 
 (* Generate the function's body for terms. *)
-let term_to_block ~loc kf env ret_ty ret_vi t =
+let term_to_block ~loc ~is_mpq kf env ret_ty ret_vi t =
   let e, _, env = !term_to_exp_ref ~adata:Assert.no_data kf env t in
   if Cil.isVoidType ret_ty then
     (* if the function's result is a GMP, it is the first parameter of the
@@ -113,7 +113,9 @@ let term_to_block ~loc kf env ret_ty ret_vi t =
     let set =
       let lv_star_ret = Cil.mkMem ~addr:(Cil.evar ~loc ret_vi) ~off:NoOffset in
       let star_ret = Smart_exp.lval ~loc lv_star_ret in
-      Gmp.init_set ~loc lv_star_ret star_ret e
+      if is_mpq
+      then Rational.init_set ~loc lv_star_ret star_ret e
+      else Gmp.init_set ~loc lv_star_ret star_ret e
     in
     let return_void = Cil.mkStmt ~valid_sid:true (Return (None, loc)) in
     let b, env = Env.pop_and_get env set ~global_clear:false Env.Middle in
@@ -123,8 +125,8 @@ let term_to_block ~loc kf env ret_ty ret_vi t =
   else
     generate_return_block ~loc env ret_vi e
 
-let generate_body ~loc kf env ret_ty ret_vi = function
-  | LBterm t -> term_to_block ~loc kf env ret_ty ret_vi t
+let generate_body ~loc ~is_mpq kf env ret_ty ret_vi = function
+  | LBterm t -> term_to_block ~loc ~is_mpq kf env ret_ty ret_vi t
   | LBpred p -> pred_to_block ~loc kf env ret_vi p
   | LBnone |LBreads _ | LBinductive _ -> assert false
 
@@ -238,7 +240,7 @@ let generate_kf ~loc fname env ret_ty params_ty params_ival li =
           kf
           (Writes [ assigned_var , From assigns_from]);
     end;
-    let b, env = generate_body ~loc kf env ret_ty ret_vi li.l_body in
+    let b, env = generate_body ~loc ~is_mpq kf env ret_ty ret_vi li.l_body in
     fundec.sbody <- b;
     (* add the generated variables in the necessary lists *)
     (* TODO: factorized the code below that add the generated vars with method
-- 
GitLab