From 028ba29cc0de5a74c4a5a4622505ec18fdb3db45 Mon Sep 17 00:00:00 2001
From: Julien Signoles <julien.signoles@cea.fr>
Date: Wed, 10 Jun 2020 09:41:09 +0200
Subject: [PATCH] [typing] fix bug when mixing integers and floats in
 annotations while -e-acsl-gmp-only is activated

---
 src/plugins/e-acsl/src/analyses/typing.ml     |  5 ++++-
 .../gmp-only/oracle_ci/functions.res.oracle   |  2 +-
 .../tests/gmp-only/oracle_ci/gen_functions.c  | 21 ++++++++++++++-----
 3 files changed, 21 insertions(+), 7 deletions(-)

diff --git a/src/plugins/e-acsl/src/analyses/typing.ml b/src/plugins/e-acsl/src/analyses/typing.ml
index 075d6bfa4a7..fa5d75b572d 100644
--- a/src/plugins/e-acsl/src/analyses/typing.ml
+++ b/src/plugins/e-acsl/src/analyses/typing.ml
@@ -292,10 +292,13 @@ let ty_of_logic_ty ?term lty =
 (* generate a context [c]. Take --e-acsl-gmp-only into account iff [use_gmp_opt]
    is true. *)
 let mk_ctx ~use_gmp_opt = function
+  | C_float _ as f ->
+    if use_gmp_opt && Options.Gmp_only.get () then Rational
+    else f
   | C_integer _ as c ->
     if use_gmp_opt && Options.Gmp_only.get () then Gmpz
     else c
-  | C_float _ | Gmpz | Rational | Real | Nan as c -> c
+  | Gmpz | Rational | Real | Nan as c -> c
 
 (* the number_ty corresponding to [t] whenever use as an offset.
    In that case, it cannot be a GMP, so it must be coerced to an integral type
diff --git a/src/plugins/e-acsl/tests/gmp-only/oracle_ci/functions.res.oracle b/src/plugins/e-acsl/tests/gmp-only/oracle_ci/functions.res.oracle
index 3a0b1952d64..3c2b35833e5 100644
--- a/src/plugins/e-acsl/tests/gmp-only/oracle_ci/functions.res.oracle
+++ b/src/plugins/e-acsl/tests/gmp-only/oracle_ci/functions.res.oracle
@@ -28,6 +28,6 @@
 [eva:alarm] tests/gmp-only/functions.c:25: Warning: 
   function __e_acsl_assert: precondition got status unknown.
 [eva:alarm] tests/gmp-only/functions.c:68: Warning: 
-  non-finite double value. assert \is_finite(__gen_e_acsl__15);
+  non-finite double value. assert \is_finite(__gen_e_acsl_cast);
 [eva:alarm] tests/gmp-only/functions.c:68: Warning: 
   function __e_acsl_assert: precondition got status unknown.
diff --git a/src/plugins/e-acsl/tests/gmp-only/oracle_ci/gen_functions.c b/src/plugins/e-acsl/tests/gmp-only/oracle_ci/gen_functions.c
index 91010d0c7a4..f06e60821c0 100644
--- a/src/plugins/e-acsl/tests/gmp-only/oracle_ci/gen_functions.c
+++ b/src/plugins/e-acsl/tests/gmp-only/oracle_ci/gen_functions.c
@@ -255,9 +255,20 @@ int main(void)
   double d = 2.0;
   {
     double __gen_e_acsl_f2_2;
+    __e_acsl_mpq_t __gen_e_acsl__15;
+    __e_acsl_mpq_t __gen_e_acsl__16;
+    int __gen_e_acsl_gt_5;
     __gen_e_acsl_f2_2 = __gen_e_acsl_f2(d);
-    __e_acsl_assert(__gen_e_acsl_f2_2 > 0.,"Assertion","main","f2(d) > 0",
+    __gmpq_init(__gen_e_acsl__15);
+    __gmpq_set_str(__gen_e_acsl__15,"0",10);
+    __gmpq_init(__gen_e_acsl__16);
+    __gmpq_set_d(__gen_e_acsl__16,__gen_e_acsl_f2_2);
+    __gen_e_acsl_gt_5 = __gmpq_cmp((__e_acsl_mpq_struct const *)(__gen_e_acsl__16),
+                                   (__e_acsl_mpq_struct const *)(__gen_e_acsl__15));
+    __e_acsl_assert(__gen_e_acsl_gt_5 > 0,"Assertion","main","f2(d) > 0",
                     "tests/gmp-only/functions.c",68);
+    __gmpq_clear(__gen_e_acsl__15);
+    __gmpq_clear(__gen_e_acsl__16);
   }
   /*@ assert f2(d) > 0; */ ;
   __retres = 0;
@@ -406,7 +417,7 @@ double __gen_e_acsl_f2(double x)
   __e_acsl_mpq_t __gen_e_acsl__13;
   __e_acsl_mpq_t __gen_e_acsl__14;
   __e_acsl_mpq_t __gen_e_acsl_div;
-  double __gen_e_acsl__15;
+  double __gen_e_acsl_cast;
   __gmpq_init(__gen_e_acsl__13);
   __gmpq_set_str(__gen_e_acsl__13,"1",10);
   __gmpq_init(__gen_e_acsl__14);
@@ -415,12 +426,12 @@ double __gen_e_acsl_f2(double x)
   __gmpq_div(__gen_e_acsl_div,
              (__e_acsl_mpq_struct const *)(__gen_e_acsl__13),
              (__e_acsl_mpq_struct const *)(__gen_e_acsl__14));
-  __gen_e_acsl__15 = __gmpq_get_d((__e_acsl_mpq_struct const *)(__gen_e_acsl_div));
+  __gen_e_acsl_cast = __gmpq_get_d((__e_acsl_mpq_struct const *)(__gen_e_acsl_div));
   __gmpq_clear(__gen_e_acsl__13);
   __gmpq_clear(__gen_e_acsl__14);
   __gmpq_clear(__gen_e_acsl_div);
-  /*@ assert Eva: is_nan_or_infinite: \is_finite(__gen_e_acsl__15); */
-  return __gen_e_acsl__15;
+  /*@ assert Eva: is_nan_or_infinite: \is_finite(__gen_e_acsl_cast); */
+  return __gen_e_acsl_cast;
 }
 
 int __gen_e_acsl_g(int x)
-- 
GitLab