From c1ffa08a3c3cd63e66f3748f1974c743545ab511 Mon Sep 17 00:00:00 2001
From: Julien Signoles <julien.signoles@cea.fr>
Date: Tue, 27 Aug 2019 15:06:56 +0200
Subject: [PATCH] [typing] improve precision for floats

---
 src/plugins/e-acsl/interval.ml                |  34 ++-
 src/plugins/e-acsl/tests/gmp/functions.c      |   5 +-
 .../tests/gmp/oracle/functions.0.res.oracle   |  10 +
 .../tests/gmp/oracle/functions.1.res.oracle   |  10 +
 .../e-acsl/tests/gmp/oracle/gen_functions.c   |  31 +++
 .../e-acsl/tests/gmp/oracle/gen_functions2.c  |  32 +++
 .../e-acsl/tests/gmp/oracle/gen_reals.c       | 259 +++++++++---------
 .../e-acsl/tests/gmp/oracle/gen_reals2.c      | 259 +++++++++---------
 .../tests/gmp/oracle/reals.0.res.oracle       |  18 +-
 .../tests/gmp/oracle/reals.1.res.oracle       |  18 +-
 src/plugins/e-acsl/translate.ml               |   3 +-
 src/plugins/e-acsl/typing.ml                  |   6 +-
 12 files changed, 383 insertions(+), 302 deletions(-)

diff --git a/src/plugins/e-acsl/interval.ml b/src/plugins/e-acsl/interval.ml
index 3aab01f01d3..4bf408a33b6 100644
--- a/src/plugins/e-acsl/interval.ml
+++ b/src/plugins/e-acsl/interval.ml
@@ -120,14 +120,42 @@ let lift_unop f = function
   | Rational | Real | Nan as i -> i
 
 let lift_binop ~safe_float f i1 i2 = match i1, i2 with
+  | Ival iv, i when Ival.is_bottom iv -> i
+  | i, Ival iv when Ival.is_bottom iv -> i
   | Ival i1, Ival i2 ->
     Ival (f i1 i2)
   | Float(k1, _), Float(k2, _) when safe_float ->
     let k = if Stdlib.compare k1 k2 >= 0 then k1 else k2 in
     Float(k, None (* lost value, if any before *))
+  | Ival iv, Float(k, _)
+  | Float(k, _), Ival iv ->
+    if safe_float
+    then
+      match Ival.min_and_max iv with
+      | None, None ->
+        (* unbounded integers *)
+        Rational
+      | Some min, Some max ->
+        (* if the interval of integers fits into the float types, then return
+           this float type; otherwise return Rational *)
+        (try
+           let to_float n = Int64.to_float (Integer.to_int64 n) in
+           let mini, maxi = to_float min, to_float max in
+           let minf, maxf = match k with
+             | FFloat ->
+               Floating_point.most_negative_single_precision_float,
+               Floating_point.max_single_precision_float
+             | FDouble -> -. Float.max_float, Float.max_float
+             | FLongDouble -> raise Exit
+           in
+           if mini >= minf && maxi <= maxf then Float(k, None) else Rational
+         with Z.Overflow | Exit ->
+           Rational)
+      | None, Some _ | Some _, None ->
+        assert false
+    else Rational (* sound over-approximation *)
   | (Ival _ | Float _ | Rational), (Float _ | Rational)
-  | (Float _ | Rational), Ival _ ->
-    (* any binary operator over a float or a rational generates a rational *)
+  | Rational, Ival _ ->
     Rational
   | (Ival _ | Float _ | Rational | Real), Real
   | Real, (Ival _ | Float _ | Rational) ->
@@ -336,7 +364,7 @@ end = struct
     let (_, p as named_p) = extract_profile ~infer old_profile t in
     try
       let old_i = LF.Hashtbl.find named_profiles named_p in
-      if is_included i old_i then true, p, old_i
+      if is_included i old_i then true, p, old_i (* fixpoint reached *)
       else begin
         let j = join i old_i in
         LF.Hashtbl.replace named_profiles named_p j;
diff --git a/src/plugins/e-acsl/tests/gmp/functions.c b/src/plugins/e-acsl/tests/gmp/functions.c
index 80f796bad6a..9d0bc001ab6 100644
--- a/src/plugins/e-acsl/tests/gmp/functions.c
+++ b/src/plugins/e-acsl/tests/gmp/functions.c
@@ -64,9 +64,10 @@ int main (void) {
 
   k(9);
 
+  double d = 2.0;
+  /*@ assert f2(d) > 0; */ ;
+
   // not yet supported
-  /* double d = 2.0; */
-  /* /\*@ assert f2(d) > 0; *\/ ; */
   /* /\*@ assert p_notyet(27); *\/ ; */
   /* /\*@ assert f_notyet(27) == 27; *\/ ; */
 }
diff --git a/src/plugins/e-acsl/tests/gmp/oracle/functions.0.res.oracle b/src/plugins/e-acsl/tests/gmp/oracle/functions.0.res.oracle
index b922d39b016..f20e6ae071a 100644
--- a/src/plugins/e-acsl/tests/gmp/oracle/functions.0.res.oracle
+++ b/src/plugins/e-acsl/tests/gmp/oracle/functions.0.res.oracle
@@ -28,4 +28,14 @@
   function __e_acsl_assert: precondition got status unknown.
 [eva:alarm] tests/gmp/functions.c:49: Warning: 
   function __e_acsl_assert: precondition got status unknown.
+[eva] using specification for function __gmpq_init
+[eva] using specification for function __gmpq_set_str
+[eva] using specification for function __gmpq_set_d
+[eva] using specification for function __gmpq_div
+[eva] using specification for function __gmpq_get_d
+[eva] using specification for function __gmpq_clear
+[eva:alarm] tests/gmp/functions.c:68: Warning: 
+  non-finite double value. assert \is_finite(__gen_e_acsl__10);
+[eva:alarm] tests/gmp/functions.c:68: Warning: 
+  function __e_acsl_assert: precondition got status unknown.
 [eva] done for function main
diff --git a/src/plugins/e-acsl/tests/gmp/oracle/functions.1.res.oracle b/src/plugins/e-acsl/tests/gmp/oracle/functions.1.res.oracle
index 6a88f942fbc..f284f855063 100644
--- a/src/plugins/e-acsl/tests/gmp/oracle/functions.1.res.oracle
+++ b/src/plugins/e-acsl/tests/gmp/oracle/functions.1.res.oracle
@@ -47,4 +47,14 @@
   function __e_acsl_assert: precondition got status unknown.
 [eva:alarm] tests/gmp/functions.c:25: Warning: 
   function __e_acsl_assert: precondition got status unknown.
+[eva] using specification for function __gmpq_init
+[eva] using specification for function __gmpq_set_str
+[eva] using specification for function __gmpq_set_d
+[eva] using specification for function __gmpq_div
+[eva] using specification for function __gmpq_get_d
+[eva] using specification for function __gmpq_clear
+[eva:alarm] tests/gmp/functions.c:68: Warning: 
+  non-finite double value. assert \is_finite(__gen_e_acsl__15);
+[eva:alarm] tests/gmp/functions.c:68: Warning: 
+  function __e_acsl_assert: precondition got status unknown.
 [eva] done for function main
diff --git a/src/plugins/e-acsl/tests/gmp/oracle/gen_functions.c b/src/plugins/e-acsl/tests/gmp/oracle/gen_functions.c
index c71d46e5640..7863ef08ac2 100644
--- a/src/plugins/e-acsl/tests/gmp/oracle/gen_functions.c
+++ b/src/plugins/e-acsl/tests/gmp/oracle/gen_functions.c
@@ -74,6 +74,8 @@ int glob = 5;
  */
 /*@ logic double f2(double x) = (double)(1 / x);
  */
+double __gen_e_acsl_f2(double x);
+
 /*@ predicate p_notyet{L}(ℤ x) = x > 0;
  */
 /*@ logic ℤ f_notyet{L}(ℤ x) = x;
@@ -203,6 +205,14 @@ int main(void)
                     (char *)"main",(char *)"t2(t1(m)) == 17",63);
   }
   __gen_e_acsl_k(9);
+  double d = 2.0;
+  /*@ assert f2(d) > 0; */
+  {
+    double __gen_e_acsl_f2_2;
+    __gen_e_acsl_f2_2 = __gen_e_acsl_f2(d);
+    __e_acsl_assert(__gen_e_acsl_f2_2 > 0.,(char *)"Assertion",
+                    (char *)"main",(char *)"f2(d) > 0",68);
+  }
   __retres = 0;
   return __retres;
 }
@@ -230,6 +240,27 @@ int __gen_e_acsl_g_hidden(int x)
   return x;
 }
 
+double __gen_e_acsl_f2(double x)
+{
+  __e_acsl_mpq_t __gen_e_acsl__8;
+  __e_acsl_mpq_t __gen_e_acsl__9;
+  __e_acsl_mpq_t __gen_e_acsl_div;
+  double __gen_e_acsl__10;
+  __gmpq_init(__gen_e_acsl__8);
+  __gmpq_set_str(__gen_e_acsl__8,"1",10);
+  __gmpq_init(__gen_e_acsl__9);
+  __gmpq_set_d(__gen_e_acsl__9,x);
+  __gmpq_init(__gen_e_acsl_div);
+  __gmpq_div(__gen_e_acsl_div,(__e_acsl_mpq_struct const *)(__gen_e_acsl__8),
+             (__e_acsl_mpq_struct const *)(__gen_e_acsl__9));
+  __gen_e_acsl__10 = __gmpq_get_d((__e_acsl_mpq_struct const *)(__gen_e_acsl_div));
+  __gmpq_clear(__gen_e_acsl__8);
+  __gmpq_clear(__gen_e_acsl__9);
+  __gmpq_clear(__gen_e_acsl_div);
+  /*@ assert Eva: is_nan_or_infinite: \is_finite(__gen_e_acsl__10); */
+  return __gen_e_acsl__10;
+}
+
 int __gen_e_acsl_g(int x)
 {
   int __gen_e_acsl_g_hidden_2;
diff --git a/src/plugins/e-acsl/tests/gmp/oracle/gen_functions2.c b/src/plugins/e-acsl/tests/gmp/oracle/gen_functions2.c
index 0feabbd93d9..7cf1bcc8904 100644
--- a/src/plugins/e-acsl/tests/gmp/oracle/gen_functions2.c
+++ b/src/plugins/e-acsl/tests/gmp/oracle/gen_functions2.c
@@ -72,6 +72,8 @@ int glob = 5;
  */
 /*@ logic double f2(double x) = (double)(1 / x);
  */
+double __gen_e_acsl_f2(double x);
+
 /*@ predicate p_notyet{L}(ℤ x) = x > 0;
  */
 /*@ logic ℤ f_notyet{L}(ℤ x) = x;
@@ -249,6 +251,14 @@ int main(void)
     __gmpz_clear(__gen_e_acsl__12);
   }
   __gen_e_acsl_k(9);
+  double d = 2.0;
+  /*@ assert f2(d) > 0; */
+  {
+    double __gen_e_acsl_f2_2;
+    __gen_e_acsl_f2_2 = __gen_e_acsl_f2(d);
+    __e_acsl_assert(__gen_e_acsl_f2_2 > 0.,(char *)"Assertion",
+                    (char *)"main",(char *)"f2(d) > 0",68);
+  }
   __retres = 0;
   return __retres;
 }
@@ -276,6 +286,28 @@ int __gen_e_acsl_g_hidden(int x)
   return x;
 }
 
+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;
+  __gmpq_init(__gen_e_acsl__13);
+  __gmpq_set_str(__gen_e_acsl__13,"1",10);
+  __gmpq_init(__gen_e_acsl__14);
+  __gmpq_set_d(__gen_e_acsl__14,x);
+  __gmpq_init(__gen_e_acsl_div);
+  __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));
+  __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;
+}
+
 int __gen_e_acsl_g(int x)
 {
   int __gen_e_acsl_g_hidden_2;
diff --git a/src/plugins/e-acsl/tests/gmp/oracle/gen_reals.c b/src/plugins/e-acsl/tests/gmp/oracle/gen_reals.c
index 2b998ee6660..7e0d70df561 100644
--- a/src/plugins/e-acsl/tests/gmp/oracle/gen_reals.c
+++ b/src/plugins/e-acsl/tests/gmp/oracle/gen_reals.c
@@ -21,166 +21,153 @@ int main(void)
   int __retres;
   __e_acsl_memory_init((int *)0,(char ***)0,(size_t)8);
   /*@ assert 3 ≢ 1.5; */
+  __e_acsl_assert(3. != 1.5,(char *)"Assertion",(char *)"main",
+                  (char *)"3 != 1.5",14);
+  /*@ assert 3 ≡ 1.5 + 1.5; */
   {
     __e_acsl_mpq_t __gen_e_acsl_;
     __e_acsl_mpq_t __gen_e_acsl__2;
-    int __gen_e_acsl_ne;
+    __e_acsl_mpq_t __gen_e_acsl__3;
+    __e_acsl_mpq_t __gen_e_acsl_add;
+    int __gen_e_acsl_eq;
     __gmpq_init(__gen_e_acsl_);
     __gmpq_set_str(__gen_e_acsl_,"3",10);
     __gmpq_init(__gen_e_acsl__2);
     __gmpq_set_d(__gen_e_acsl__2,1.5);
-    __gen_e_acsl_ne = __gmpq_cmp((__e_acsl_mpq_struct const *)(__gen_e_acsl_),
-                                 (__e_acsl_mpq_struct const *)(__gen_e_acsl__2));
-    __e_acsl_assert(__gen_e_acsl_ne != 0,(char *)"Assertion",(char *)"main",
-                    (char *)"3 != 1.5",14);
-    __gmpq_clear(__gen_e_acsl_);
-    __gmpq_clear(__gen_e_acsl__2);
-  }
-  /*@ assert 3 ≡ 1.5 + 1.5; */
-  {
-    __e_acsl_mpq_t __gen_e_acsl__3;
-    __e_acsl_mpq_t __gen_e_acsl__4;
-    __e_acsl_mpq_t __gen_e_acsl__5;
-    __e_acsl_mpq_t __gen_e_acsl_add;
-    int __gen_e_acsl_eq;
     __gmpq_init(__gen_e_acsl__3);
-    __gmpq_set_str(__gen_e_acsl__3,"3",10);
-    __gmpq_init(__gen_e_acsl__4);
-    __gmpq_set_d(__gen_e_acsl__4,1.5);
-    __gmpq_init(__gen_e_acsl__5);
-    __gmpq_set_d(__gen_e_acsl__5,1.5);
+    __gmpq_set_d(__gen_e_acsl__3,1.5);
     __gmpq_init(__gen_e_acsl_add);
     __gmpq_add(__gen_e_acsl_add,
-               (__e_acsl_mpq_struct const *)(__gen_e_acsl__4),
-               (__e_acsl_mpq_struct const *)(__gen_e_acsl__5));
-    __gen_e_acsl_eq = __gmpq_cmp((__e_acsl_mpq_struct const *)(__gen_e_acsl__3),
+               (__e_acsl_mpq_struct const *)(__gen_e_acsl__2),
+               (__e_acsl_mpq_struct const *)(__gen_e_acsl__3));
+    __gen_e_acsl_eq = __gmpq_cmp((__e_acsl_mpq_struct const *)(__gen_e_acsl_),
                                  (__e_acsl_mpq_struct const *)(__gen_e_acsl_add));
     __e_acsl_assert(__gen_e_acsl_eq == 0,(char *)"Assertion",(char *)"main",
                     (char *)"3 == 1.5 + 1.5",15);
+    __gmpq_clear(__gen_e_acsl_);
+    __gmpq_clear(__gen_e_acsl__2);
     __gmpq_clear(__gen_e_acsl__3);
-    __gmpq_clear(__gen_e_acsl__4);
-    __gmpq_clear(__gen_e_acsl__5);
     __gmpq_clear(__gen_e_acsl_add);
   }
   /*@ assert 0.1 ≡ 0.1; */
   {
-    __e_acsl_mpq_t __gen_e_acsl__6;
+    __e_acsl_mpq_t __gen_e_acsl__4;
     int __gen_e_acsl_eq_2;
-    __gmpq_init(__gen_e_acsl__6);
-    __gmpq_set_str(__gen_e_acsl__6,"01/10",10);
-    __gen_e_acsl_eq_2 = __gmpq_cmp((__e_acsl_mpq_struct const *)(__gen_e_acsl__6),
-                                   (__e_acsl_mpq_struct const *)(__gen_e_acsl__6));
+    __gmpq_init(__gen_e_acsl__4);
+    __gmpq_set_str(__gen_e_acsl__4,"01/10",10);
+    __gen_e_acsl_eq_2 = __gmpq_cmp((__e_acsl_mpq_struct const *)(__gen_e_acsl__4),
+                                   (__e_acsl_mpq_struct const *)(__gen_e_acsl__4));
     __e_acsl_assert(__gen_e_acsl_eq_2 == 0,(char *)"Assertion",
                     (char *)"main",(char *)"0.1 == 0.1",16);
-    __gmpq_clear(__gen_e_acsl__6);
+    __gmpq_clear(__gen_e_acsl__4);
   }
   /*@ assert (double)1.0 ≡ 1.0; */
   __e_acsl_assert(1. == 1.,(char *)"Assertion",(char *)"main",
                   (char *)"(double)1.0 == 1.0",17);
   /*@ assert (double)0.1 ≢ 0.1; */
   {
+    __e_acsl_mpq_t __gen_e_acsl__5;
+    double __gen_e_acsl__6;
     __e_acsl_mpq_t __gen_e_acsl__7;
-    double __gen_e_acsl__8;
-    __e_acsl_mpq_t __gen_e_acsl__9;
-    int __gen_e_acsl_ne_2;
+    int __gen_e_acsl_ne;
+    __gmpq_init(__gen_e_acsl__5);
+    __gmpq_set_str(__gen_e_acsl__5,"01/10",10);
+    __gen_e_acsl__6 = __gmpq_get_d((__e_acsl_mpq_struct const *)(__gen_e_acsl__5));
     __gmpq_init(__gen_e_acsl__7);
-    __gmpq_set_str(__gen_e_acsl__7,"01/10",10);
-    __gen_e_acsl__8 = __gmpq_get_d((__e_acsl_mpq_struct const *)(__gen_e_acsl__7));
-    __gmpq_init(__gen_e_acsl__9);
-    /*@ assert Eva: is_nan_or_infinite: \is_finite(__gen_e_acsl__8); */
-    __gmpq_set_d(__gen_e_acsl__9,__gen_e_acsl__8);
-    __gen_e_acsl_ne_2 = __gmpq_cmp((__e_acsl_mpq_struct const *)(__gen_e_acsl__9),
-                                   (__e_acsl_mpq_struct const *)(__gen_e_acsl__7));
-    __e_acsl_assert(__gen_e_acsl_ne_2 != 0,(char *)"Assertion",
-                    (char *)"main",(char *)"(double)0.1 != 0.1",18);
+    /*@ assert Eva: is_nan_or_infinite: \is_finite(__gen_e_acsl__6); */
+    __gmpq_set_d(__gen_e_acsl__7,__gen_e_acsl__6);
+    __gen_e_acsl_ne = __gmpq_cmp((__e_acsl_mpq_struct const *)(__gen_e_acsl__7),
+                                 (__e_acsl_mpq_struct const *)(__gen_e_acsl__5));
+    __e_acsl_assert(__gen_e_acsl_ne != 0,(char *)"Assertion",(char *)"main",
+                    (char *)"(double)0.1 != 0.1",18);
+    __gmpq_clear(__gen_e_acsl__5);
     __gmpq_clear(__gen_e_acsl__7);
-    __gmpq_clear(__gen_e_acsl__9);
   }
   /*@ assert (float)0.1 ≢ (double)0.1; */
   {
-    __e_acsl_mpq_t __gen_e_acsl__10;
-    double __gen_e_acsl__11;
-    double __gen_e_acsl__12;
-    __gmpq_init(__gen_e_acsl__10);
-    __gmpq_set_str(__gen_e_acsl__10,"01/10",10);
-    __gen_e_acsl__11 = __gmpq_get_d((__e_acsl_mpq_struct const *)(__gen_e_acsl__10));
-    __gen_e_acsl__12 = __gmpq_get_d((__e_acsl_mpq_struct const *)(__gen_e_acsl__10));
-    /*@ assert Eva: is_nan_or_infinite: \is_finite(__gen_e_acsl__11); */
-    /*@ assert Eva: is_nan_or_infinite: \is_finite(__gen_e_acsl__12); */
-    /*@ assert Eva: is_nan_or_infinite: \is_finite((float)__gen_e_acsl__11);
+    __e_acsl_mpq_t __gen_e_acsl__8;
+    double __gen_e_acsl__9;
+    double __gen_e_acsl__10;
+    __gmpq_init(__gen_e_acsl__8);
+    __gmpq_set_str(__gen_e_acsl__8,"01/10",10);
+    __gen_e_acsl__9 = __gmpq_get_d((__e_acsl_mpq_struct const *)(__gen_e_acsl__8));
+    __gen_e_acsl__10 = __gmpq_get_d((__e_acsl_mpq_struct const *)(__gen_e_acsl__8));
+    /*@ assert Eva: is_nan_or_infinite: \is_finite(__gen_e_acsl__9); */
+    /*@ assert Eva: is_nan_or_infinite: \is_finite(__gen_e_acsl__10); */
+    /*@ assert Eva: is_nan_or_infinite: \is_finite((float)__gen_e_acsl__9);
     */
-    __e_acsl_assert((double)((float)__gen_e_acsl__11) != __gen_e_acsl__12,
+    __e_acsl_assert((double)((float)__gen_e_acsl__9) != __gen_e_acsl__10,
                     (char *)"Assertion",(char *)"main",
                     (char *)"(float)0.1 != (double)0.1",19);
-    __gmpq_clear(__gen_e_acsl__10);
+    __gmpq_clear(__gen_e_acsl__8);
   }
   /*@ assert (double)1.1 ≢ 1 + 0.1; */
   {
+    __e_acsl_mpq_t __gen_e_acsl__11;
+    double __gen_e_acsl__12;
     __e_acsl_mpq_t __gen_e_acsl__13;
-    double __gen_e_acsl__14;
-    __e_acsl_mpq_t __gen_e_acsl__15;
-    __e_acsl_mpq_t __gen_e_acsl__16;
+    __e_acsl_mpq_t __gen_e_acsl__14;
     __e_acsl_mpq_t __gen_e_acsl_add_2;
-    __e_acsl_mpq_t __gen_e_acsl__17;
-    int __gen_e_acsl_ne_3;
+    __e_acsl_mpq_t __gen_e_acsl__15;
+    int __gen_e_acsl_ne_2;
+    __gmpq_init(__gen_e_acsl__11);
+    __gmpq_set_str(__gen_e_acsl__11,"11/10",10);
+    __gen_e_acsl__12 = __gmpq_get_d((__e_acsl_mpq_struct const *)(__gen_e_acsl__11));
     __gmpq_init(__gen_e_acsl__13);
-    __gmpq_set_str(__gen_e_acsl__13,"11/10",10);
-    __gen_e_acsl__14 = __gmpq_get_d((__e_acsl_mpq_struct const *)(__gen_e_acsl__13));
-    __gmpq_init(__gen_e_acsl__15);
-    __gmpq_set_str(__gen_e_acsl__15,"1",10);
-    __gmpq_init(__gen_e_acsl__16);
-    __gmpq_set_str(__gen_e_acsl__16,"01/10",10);
+    __gmpq_set_str(__gen_e_acsl__13,"1",10);
+    __gmpq_init(__gen_e_acsl__14);
+    __gmpq_set_str(__gen_e_acsl__14,"01/10",10);
     __gmpq_init(__gen_e_acsl_add_2);
     __gmpq_add(__gen_e_acsl_add_2,
-               (__e_acsl_mpq_struct const *)(__gen_e_acsl__15),
-               (__e_acsl_mpq_struct const *)(__gen_e_acsl__16));
-    __gmpq_init(__gen_e_acsl__17);
-    /*@ assert Eva: is_nan_or_infinite: \is_finite(__gen_e_acsl__14); */
-    __gmpq_set_d(__gen_e_acsl__17,__gen_e_acsl__14);
-    __gen_e_acsl_ne_3 = __gmpq_cmp((__e_acsl_mpq_struct const *)(__gen_e_acsl__17),
+               (__e_acsl_mpq_struct const *)(__gen_e_acsl__13),
+               (__e_acsl_mpq_struct const *)(__gen_e_acsl__14));
+    __gmpq_init(__gen_e_acsl__15);
+    /*@ assert Eva: is_nan_or_infinite: \is_finite(__gen_e_acsl__12); */
+    __gmpq_set_d(__gen_e_acsl__15,__gen_e_acsl__12);
+    __gen_e_acsl_ne_2 = __gmpq_cmp((__e_acsl_mpq_struct const *)(__gen_e_acsl__15),
                                    (__e_acsl_mpq_struct const *)(__gen_e_acsl_add_2));
-    __e_acsl_assert(__gen_e_acsl_ne_3 != 0,(char *)"Assertion",
+    __e_acsl_assert(__gen_e_acsl_ne_2 != 0,(char *)"Assertion",
                     (char *)"main",(char *)"(double)1.1 != 1 + 0.1",20);
+    __gmpq_clear(__gen_e_acsl__11);
     __gmpq_clear(__gen_e_acsl__13);
-    __gmpq_clear(__gen_e_acsl__15);
-    __gmpq_clear(__gen_e_acsl__16);
+    __gmpq_clear(__gen_e_acsl__14);
     __gmpq_clear(__gen_e_acsl_add_2);
-    __gmpq_clear(__gen_e_acsl__17);
+    __gmpq_clear(__gen_e_acsl__15);
   }
   /*@ assert 1 + 0.1 ≡ 2 - 0.9; */
   {
+    __e_acsl_mpq_t __gen_e_acsl__16;
+    __e_acsl_mpq_t __gen_e_acsl__17;
+    __e_acsl_mpq_t __gen_e_acsl_add_3;
     __e_acsl_mpq_t __gen_e_acsl__18;
     __e_acsl_mpq_t __gen_e_acsl__19;
-    __e_acsl_mpq_t __gen_e_acsl_add_3;
-    __e_acsl_mpq_t __gen_e_acsl__20;
-    __e_acsl_mpq_t __gen_e_acsl__21;
     __e_acsl_mpq_t __gen_e_acsl_sub;
     int __gen_e_acsl_eq_3;
-    __gmpq_init(__gen_e_acsl__18);
-    __gmpq_set_str(__gen_e_acsl__18,"1",10);
-    __gmpq_init(__gen_e_acsl__19);
-    __gmpq_set_str(__gen_e_acsl__19,"01/10",10);
+    __gmpq_init(__gen_e_acsl__16);
+    __gmpq_set_str(__gen_e_acsl__16,"1",10);
+    __gmpq_init(__gen_e_acsl__17);
+    __gmpq_set_str(__gen_e_acsl__17,"01/10",10);
     __gmpq_init(__gen_e_acsl_add_3);
     __gmpq_add(__gen_e_acsl_add_3,
-               (__e_acsl_mpq_struct const *)(__gen_e_acsl__18),
-               (__e_acsl_mpq_struct const *)(__gen_e_acsl__19));
-    __gmpq_init(__gen_e_acsl__20);
-    __gmpq_set_str(__gen_e_acsl__20,"2",10);
-    __gmpq_init(__gen_e_acsl__21);
-    __gmpq_set_str(__gen_e_acsl__21,"09/10",10);
+               (__e_acsl_mpq_struct const *)(__gen_e_acsl__16),
+               (__e_acsl_mpq_struct const *)(__gen_e_acsl__17));
+    __gmpq_init(__gen_e_acsl__18);
+    __gmpq_set_str(__gen_e_acsl__18,"2",10);
+    __gmpq_init(__gen_e_acsl__19);
+    __gmpq_set_str(__gen_e_acsl__19,"09/10",10);
     __gmpq_init(__gen_e_acsl_sub);
     __gmpq_sub(__gen_e_acsl_sub,
-               (__e_acsl_mpq_struct const *)(__gen_e_acsl__20),
-               (__e_acsl_mpq_struct const *)(__gen_e_acsl__21));
+               (__e_acsl_mpq_struct const *)(__gen_e_acsl__18),
+               (__e_acsl_mpq_struct const *)(__gen_e_acsl__19));
     __gen_e_acsl_eq_3 = __gmpq_cmp((__e_acsl_mpq_struct const *)(__gen_e_acsl_add_3),
                                    (__e_acsl_mpq_struct const *)(__gen_e_acsl_sub));
     __e_acsl_assert(__gen_e_acsl_eq_3 == 0,(char *)"Assertion",
                     (char *)"main",(char *)"1 + 0.1 == 2 - 0.9",21);
+    __gmpq_clear(__gen_e_acsl__16);
+    __gmpq_clear(__gen_e_acsl__17);
+    __gmpq_clear(__gen_e_acsl_add_3);
     __gmpq_clear(__gen_e_acsl__18);
     __gmpq_clear(__gen_e_acsl__19);
-    __gmpq_clear(__gen_e_acsl_add_3);
-    __gmpq_clear(__gen_e_acsl__20);
-    __gmpq_clear(__gen_e_acsl__21);
     __gmpq_clear(__gen_e_acsl_sub);
   }
   float x = 0.2f;
@@ -189,84 +176,84 @@ int main(void)
   /*@ assert sum ≢ x * y; */
   {
     __e_acsl_mpq_t __gen_e_acsl_y;
-    __e_acsl_mpq_t __gen_e_acsl__22;
+    __e_acsl_mpq_t __gen_e_acsl__20;
     __e_acsl_mpq_t __gen_e_acsl_mul;
-    __e_acsl_mpq_t __gen_e_acsl__23;
-    int __gen_e_acsl_ne_4;
+    __e_acsl_mpq_t __gen_e_acsl__21;
+    int __gen_e_acsl_ne_3;
     __gmpq_init(__gen_e_acsl_y);
     __gmpq_set_d(__gen_e_acsl_y,(double)y);
-    __gmpq_init(__gen_e_acsl__22);
-    __gmpq_set_d(__gen_e_acsl__22,(double)x);
+    __gmpq_init(__gen_e_acsl__20);
+    __gmpq_set_d(__gen_e_acsl__20,(double)x);
     __gmpq_init(__gen_e_acsl_mul);
     __gmpq_mul(__gen_e_acsl_mul,
-               (__e_acsl_mpq_struct const *)(__gen_e_acsl__22),
+               (__e_acsl_mpq_struct const *)(__gen_e_acsl__20),
                (__e_acsl_mpq_struct const *)(__gen_e_acsl_y));
-    __gmpq_init(__gen_e_acsl__23);
-    __gmpq_set_d(__gen_e_acsl__23,(double)sum);
-    __gen_e_acsl_ne_4 = __gmpq_cmp((__e_acsl_mpq_struct const *)(__gen_e_acsl__23),
+    __gmpq_init(__gen_e_acsl__21);
+    __gmpq_set_d(__gen_e_acsl__21,(double)sum);
+    __gen_e_acsl_ne_3 = __gmpq_cmp((__e_acsl_mpq_struct const *)(__gen_e_acsl__21),
                                    (__e_acsl_mpq_struct const *)(__gen_e_acsl_mul));
-    __e_acsl_assert(__gen_e_acsl_ne_4 != 0,(char *)"Assertion",
+    __e_acsl_assert(__gen_e_acsl_ne_3 != 0,(char *)"Assertion",
                     (char *)"main",(char *)"sum != x * y",25);
     __gmpq_clear(__gen_e_acsl_y);
-    __gmpq_clear(__gen_e_acsl__22);
+    __gmpq_clear(__gen_e_acsl__20);
     __gmpq_clear(__gen_e_acsl_mul);
-    __gmpq_clear(__gen_e_acsl__23);
+    __gmpq_clear(__gen_e_acsl__21);
   }
   /*@ assert \let n = 1; 4 ≡ n + 3.0; */
   {
     int __gen_e_acsl_n;
+    __e_acsl_mpq_t __gen_e_acsl__22;
+    __e_acsl_mpq_t __gen_e_acsl__23;
     __e_acsl_mpq_t __gen_e_acsl__24;
-    __e_acsl_mpq_t __gen_e_acsl__25;
-    __e_acsl_mpq_t __gen_e_acsl__26;
     __e_acsl_mpq_t __gen_e_acsl_add_4;
     int __gen_e_acsl_eq_4;
     __gen_e_acsl_n = 1;
+    __gmpq_init(__gen_e_acsl__22);
+    __gmpq_set_str(__gen_e_acsl__22,"4",10);
+    __gmpq_init(__gen_e_acsl__23);
+    __gmpq_set_d(__gen_e_acsl__23,3.);
     __gmpq_init(__gen_e_acsl__24);
-    __gmpq_set_str(__gen_e_acsl__24,"4",10);
-    __gmpq_init(__gen_e_acsl__25);
-    __gmpq_set_d(__gen_e_acsl__25,3.);
-    __gmpq_init(__gen_e_acsl__26);
-    __gmpq_set_si(__gen_e_acsl__26,(long)__gen_e_acsl_n);
+    __gmpq_set_si(__gen_e_acsl__24,(long)__gen_e_acsl_n);
     __gmpq_init(__gen_e_acsl_add_4);
     __gmpq_add(__gen_e_acsl_add_4,
-               (__e_acsl_mpq_struct const *)(__gen_e_acsl__26),
-               (__e_acsl_mpq_struct const *)(__gen_e_acsl__25));
-    __gen_e_acsl_eq_4 = __gmpq_cmp((__e_acsl_mpq_struct const *)(__gen_e_acsl__24),
+               (__e_acsl_mpq_struct const *)(__gen_e_acsl__24),
+               (__e_acsl_mpq_struct const *)(__gen_e_acsl__23));
+    __gen_e_acsl_eq_4 = __gmpq_cmp((__e_acsl_mpq_struct const *)(__gen_e_acsl__22),
                                    (__e_acsl_mpq_struct const *)(__gen_e_acsl_add_4));
     __e_acsl_assert(__gen_e_acsl_eq_4 == 0,(char *)"Assertion",
                     (char *)"main",(char *)"\\let n = 1; 4 == n + 3.0",26);
+    __gmpq_clear(__gen_e_acsl__22);
+    __gmpq_clear(__gen_e_acsl__23);
     __gmpq_clear(__gen_e_acsl__24);
-    __gmpq_clear(__gen_e_acsl__25);
-    __gmpq_clear(__gen_e_acsl__26);
     __gmpq_clear(__gen_e_acsl_add_4);
   }
   double d = 0.1;
   __gen_e_acsl_avg(4.3,11.7);
   /*@ assert 1.1d ≢ 1 + 0.1; */
   {
-    __e_acsl_mpq_t __gen_e_acsl__27;
-    __e_acsl_mpq_t __gen_e_acsl__28;
+    __e_acsl_mpq_t __gen_e_acsl__25;
+    __e_acsl_mpq_t __gen_e_acsl__26;
     __e_acsl_mpq_t __gen_e_acsl_add_5;
-    __e_acsl_mpq_t __gen_e_acsl__29;
-    int __gen_e_acsl_ne_5;
-    __gmpq_init(__gen_e_acsl__27);
-    __gmpq_set_str(__gen_e_acsl__27,"1",10);
-    __gmpq_init(__gen_e_acsl__28);
-    __gmpq_set_str(__gen_e_acsl__28,"01/10",10);
+    __e_acsl_mpq_t __gen_e_acsl__27;
+    int __gen_e_acsl_ne_4;
+    __gmpq_init(__gen_e_acsl__25);
+    __gmpq_set_str(__gen_e_acsl__25,"1",10);
+    __gmpq_init(__gen_e_acsl__26);
+    __gmpq_set_str(__gen_e_acsl__26,"01/10",10);
     __gmpq_init(__gen_e_acsl_add_5);
     __gmpq_add(__gen_e_acsl_add_5,
-               (__e_acsl_mpq_struct const *)(__gen_e_acsl__27),
-               (__e_acsl_mpq_struct const *)(__gen_e_acsl__28));
-    __gmpq_init(__gen_e_acsl__29);
-    __gmpq_set_d(__gen_e_acsl__29,1.1);
-    __gen_e_acsl_ne_5 = __gmpq_cmp((__e_acsl_mpq_struct const *)(__gen_e_acsl__29),
+               (__e_acsl_mpq_struct const *)(__gen_e_acsl__25),
+               (__e_acsl_mpq_struct const *)(__gen_e_acsl__26));
+    __gmpq_init(__gen_e_acsl__27);
+    __gmpq_set_d(__gen_e_acsl__27,1.1);
+    __gen_e_acsl_ne_4 = __gmpq_cmp((__e_acsl_mpq_struct const *)(__gen_e_acsl__27),
                                    (__e_acsl_mpq_struct const *)(__gen_e_acsl_add_5));
-    __e_acsl_assert(__gen_e_acsl_ne_5 != 0,(char *)"Assertion",
+    __e_acsl_assert(__gen_e_acsl_ne_4 != 0,(char *)"Assertion",
                     (char *)"main",(char *)"1.1d != 1 + 0.1",32);
-    __gmpq_clear(__gen_e_acsl__27);
-    __gmpq_clear(__gen_e_acsl__28);
+    __gmpq_clear(__gen_e_acsl__25);
+    __gmpq_clear(__gen_e_acsl__26);
     __gmpq_clear(__gen_e_acsl_add_5);
-    __gmpq_clear(__gen_e_acsl__29);
+    __gmpq_clear(__gen_e_acsl__27);
   }
   __retres = 0;
   return __retres;
diff --git a/src/plugins/e-acsl/tests/gmp/oracle/gen_reals2.c b/src/plugins/e-acsl/tests/gmp/oracle/gen_reals2.c
index 2b998ee6660..7e0d70df561 100644
--- a/src/plugins/e-acsl/tests/gmp/oracle/gen_reals2.c
+++ b/src/plugins/e-acsl/tests/gmp/oracle/gen_reals2.c
@@ -21,166 +21,153 @@ int main(void)
   int __retres;
   __e_acsl_memory_init((int *)0,(char ***)0,(size_t)8);
   /*@ assert 3 ≢ 1.5; */
+  __e_acsl_assert(3. != 1.5,(char *)"Assertion",(char *)"main",
+                  (char *)"3 != 1.5",14);
+  /*@ assert 3 ≡ 1.5 + 1.5; */
   {
     __e_acsl_mpq_t __gen_e_acsl_;
     __e_acsl_mpq_t __gen_e_acsl__2;
-    int __gen_e_acsl_ne;
+    __e_acsl_mpq_t __gen_e_acsl__3;
+    __e_acsl_mpq_t __gen_e_acsl_add;
+    int __gen_e_acsl_eq;
     __gmpq_init(__gen_e_acsl_);
     __gmpq_set_str(__gen_e_acsl_,"3",10);
     __gmpq_init(__gen_e_acsl__2);
     __gmpq_set_d(__gen_e_acsl__2,1.5);
-    __gen_e_acsl_ne = __gmpq_cmp((__e_acsl_mpq_struct const *)(__gen_e_acsl_),
-                                 (__e_acsl_mpq_struct const *)(__gen_e_acsl__2));
-    __e_acsl_assert(__gen_e_acsl_ne != 0,(char *)"Assertion",(char *)"main",
-                    (char *)"3 != 1.5",14);
-    __gmpq_clear(__gen_e_acsl_);
-    __gmpq_clear(__gen_e_acsl__2);
-  }
-  /*@ assert 3 ≡ 1.5 + 1.5; */
-  {
-    __e_acsl_mpq_t __gen_e_acsl__3;
-    __e_acsl_mpq_t __gen_e_acsl__4;
-    __e_acsl_mpq_t __gen_e_acsl__5;
-    __e_acsl_mpq_t __gen_e_acsl_add;
-    int __gen_e_acsl_eq;
     __gmpq_init(__gen_e_acsl__3);
-    __gmpq_set_str(__gen_e_acsl__3,"3",10);
-    __gmpq_init(__gen_e_acsl__4);
-    __gmpq_set_d(__gen_e_acsl__4,1.5);
-    __gmpq_init(__gen_e_acsl__5);
-    __gmpq_set_d(__gen_e_acsl__5,1.5);
+    __gmpq_set_d(__gen_e_acsl__3,1.5);
     __gmpq_init(__gen_e_acsl_add);
     __gmpq_add(__gen_e_acsl_add,
-               (__e_acsl_mpq_struct const *)(__gen_e_acsl__4),
-               (__e_acsl_mpq_struct const *)(__gen_e_acsl__5));
-    __gen_e_acsl_eq = __gmpq_cmp((__e_acsl_mpq_struct const *)(__gen_e_acsl__3),
+               (__e_acsl_mpq_struct const *)(__gen_e_acsl__2),
+               (__e_acsl_mpq_struct const *)(__gen_e_acsl__3));
+    __gen_e_acsl_eq = __gmpq_cmp((__e_acsl_mpq_struct const *)(__gen_e_acsl_),
                                  (__e_acsl_mpq_struct const *)(__gen_e_acsl_add));
     __e_acsl_assert(__gen_e_acsl_eq == 0,(char *)"Assertion",(char *)"main",
                     (char *)"3 == 1.5 + 1.5",15);
+    __gmpq_clear(__gen_e_acsl_);
+    __gmpq_clear(__gen_e_acsl__2);
     __gmpq_clear(__gen_e_acsl__3);
-    __gmpq_clear(__gen_e_acsl__4);
-    __gmpq_clear(__gen_e_acsl__5);
     __gmpq_clear(__gen_e_acsl_add);
   }
   /*@ assert 0.1 ≡ 0.1; */
   {
-    __e_acsl_mpq_t __gen_e_acsl__6;
+    __e_acsl_mpq_t __gen_e_acsl__4;
     int __gen_e_acsl_eq_2;
-    __gmpq_init(__gen_e_acsl__6);
-    __gmpq_set_str(__gen_e_acsl__6,"01/10",10);
-    __gen_e_acsl_eq_2 = __gmpq_cmp((__e_acsl_mpq_struct const *)(__gen_e_acsl__6),
-                                   (__e_acsl_mpq_struct const *)(__gen_e_acsl__6));
+    __gmpq_init(__gen_e_acsl__4);
+    __gmpq_set_str(__gen_e_acsl__4,"01/10",10);
+    __gen_e_acsl_eq_2 = __gmpq_cmp((__e_acsl_mpq_struct const *)(__gen_e_acsl__4),
+                                   (__e_acsl_mpq_struct const *)(__gen_e_acsl__4));
     __e_acsl_assert(__gen_e_acsl_eq_2 == 0,(char *)"Assertion",
                     (char *)"main",(char *)"0.1 == 0.1",16);
-    __gmpq_clear(__gen_e_acsl__6);
+    __gmpq_clear(__gen_e_acsl__4);
   }
   /*@ assert (double)1.0 ≡ 1.0; */
   __e_acsl_assert(1. == 1.,(char *)"Assertion",(char *)"main",
                   (char *)"(double)1.0 == 1.0",17);
   /*@ assert (double)0.1 ≢ 0.1; */
   {
+    __e_acsl_mpq_t __gen_e_acsl__5;
+    double __gen_e_acsl__6;
     __e_acsl_mpq_t __gen_e_acsl__7;
-    double __gen_e_acsl__8;
-    __e_acsl_mpq_t __gen_e_acsl__9;
-    int __gen_e_acsl_ne_2;
+    int __gen_e_acsl_ne;
+    __gmpq_init(__gen_e_acsl__5);
+    __gmpq_set_str(__gen_e_acsl__5,"01/10",10);
+    __gen_e_acsl__6 = __gmpq_get_d((__e_acsl_mpq_struct const *)(__gen_e_acsl__5));
     __gmpq_init(__gen_e_acsl__7);
-    __gmpq_set_str(__gen_e_acsl__7,"01/10",10);
-    __gen_e_acsl__8 = __gmpq_get_d((__e_acsl_mpq_struct const *)(__gen_e_acsl__7));
-    __gmpq_init(__gen_e_acsl__9);
-    /*@ assert Eva: is_nan_or_infinite: \is_finite(__gen_e_acsl__8); */
-    __gmpq_set_d(__gen_e_acsl__9,__gen_e_acsl__8);
-    __gen_e_acsl_ne_2 = __gmpq_cmp((__e_acsl_mpq_struct const *)(__gen_e_acsl__9),
-                                   (__e_acsl_mpq_struct const *)(__gen_e_acsl__7));
-    __e_acsl_assert(__gen_e_acsl_ne_2 != 0,(char *)"Assertion",
-                    (char *)"main",(char *)"(double)0.1 != 0.1",18);
+    /*@ assert Eva: is_nan_or_infinite: \is_finite(__gen_e_acsl__6); */
+    __gmpq_set_d(__gen_e_acsl__7,__gen_e_acsl__6);
+    __gen_e_acsl_ne = __gmpq_cmp((__e_acsl_mpq_struct const *)(__gen_e_acsl__7),
+                                 (__e_acsl_mpq_struct const *)(__gen_e_acsl__5));
+    __e_acsl_assert(__gen_e_acsl_ne != 0,(char *)"Assertion",(char *)"main",
+                    (char *)"(double)0.1 != 0.1",18);
+    __gmpq_clear(__gen_e_acsl__5);
     __gmpq_clear(__gen_e_acsl__7);
-    __gmpq_clear(__gen_e_acsl__9);
   }
   /*@ assert (float)0.1 ≢ (double)0.1; */
   {
-    __e_acsl_mpq_t __gen_e_acsl__10;
-    double __gen_e_acsl__11;
-    double __gen_e_acsl__12;
-    __gmpq_init(__gen_e_acsl__10);
-    __gmpq_set_str(__gen_e_acsl__10,"01/10",10);
-    __gen_e_acsl__11 = __gmpq_get_d((__e_acsl_mpq_struct const *)(__gen_e_acsl__10));
-    __gen_e_acsl__12 = __gmpq_get_d((__e_acsl_mpq_struct const *)(__gen_e_acsl__10));
-    /*@ assert Eva: is_nan_or_infinite: \is_finite(__gen_e_acsl__11); */
-    /*@ assert Eva: is_nan_or_infinite: \is_finite(__gen_e_acsl__12); */
-    /*@ assert Eva: is_nan_or_infinite: \is_finite((float)__gen_e_acsl__11);
+    __e_acsl_mpq_t __gen_e_acsl__8;
+    double __gen_e_acsl__9;
+    double __gen_e_acsl__10;
+    __gmpq_init(__gen_e_acsl__8);
+    __gmpq_set_str(__gen_e_acsl__8,"01/10",10);
+    __gen_e_acsl__9 = __gmpq_get_d((__e_acsl_mpq_struct const *)(__gen_e_acsl__8));
+    __gen_e_acsl__10 = __gmpq_get_d((__e_acsl_mpq_struct const *)(__gen_e_acsl__8));
+    /*@ assert Eva: is_nan_or_infinite: \is_finite(__gen_e_acsl__9); */
+    /*@ assert Eva: is_nan_or_infinite: \is_finite(__gen_e_acsl__10); */
+    /*@ assert Eva: is_nan_or_infinite: \is_finite((float)__gen_e_acsl__9);
     */
-    __e_acsl_assert((double)((float)__gen_e_acsl__11) != __gen_e_acsl__12,
+    __e_acsl_assert((double)((float)__gen_e_acsl__9) != __gen_e_acsl__10,
                     (char *)"Assertion",(char *)"main",
                     (char *)"(float)0.1 != (double)0.1",19);
-    __gmpq_clear(__gen_e_acsl__10);
+    __gmpq_clear(__gen_e_acsl__8);
   }
   /*@ assert (double)1.1 ≢ 1 + 0.1; */
   {
+    __e_acsl_mpq_t __gen_e_acsl__11;
+    double __gen_e_acsl__12;
     __e_acsl_mpq_t __gen_e_acsl__13;
-    double __gen_e_acsl__14;
-    __e_acsl_mpq_t __gen_e_acsl__15;
-    __e_acsl_mpq_t __gen_e_acsl__16;
+    __e_acsl_mpq_t __gen_e_acsl__14;
     __e_acsl_mpq_t __gen_e_acsl_add_2;
-    __e_acsl_mpq_t __gen_e_acsl__17;
-    int __gen_e_acsl_ne_3;
+    __e_acsl_mpq_t __gen_e_acsl__15;
+    int __gen_e_acsl_ne_2;
+    __gmpq_init(__gen_e_acsl__11);
+    __gmpq_set_str(__gen_e_acsl__11,"11/10",10);
+    __gen_e_acsl__12 = __gmpq_get_d((__e_acsl_mpq_struct const *)(__gen_e_acsl__11));
     __gmpq_init(__gen_e_acsl__13);
-    __gmpq_set_str(__gen_e_acsl__13,"11/10",10);
-    __gen_e_acsl__14 = __gmpq_get_d((__e_acsl_mpq_struct const *)(__gen_e_acsl__13));
-    __gmpq_init(__gen_e_acsl__15);
-    __gmpq_set_str(__gen_e_acsl__15,"1",10);
-    __gmpq_init(__gen_e_acsl__16);
-    __gmpq_set_str(__gen_e_acsl__16,"01/10",10);
+    __gmpq_set_str(__gen_e_acsl__13,"1",10);
+    __gmpq_init(__gen_e_acsl__14);
+    __gmpq_set_str(__gen_e_acsl__14,"01/10",10);
     __gmpq_init(__gen_e_acsl_add_2);
     __gmpq_add(__gen_e_acsl_add_2,
-               (__e_acsl_mpq_struct const *)(__gen_e_acsl__15),
-               (__e_acsl_mpq_struct const *)(__gen_e_acsl__16));
-    __gmpq_init(__gen_e_acsl__17);
-    /*@ assert Eva: is_nan_or_infinite: \is_finite(__gen_e_acsl__14); */
-    __gmpq_set_d(__gen_e_acsl__17,__gen_e_acsl__14);
-    __gen_e_acsl_ne_3 = __gmpq_cmp((__e_acsl_mpq_struct const *)(__gen_e_acsl__17),
+               (__e_acsl_mpq_struct const *)(__gen_e_acsl__13),
+               (__e_acsl_mpq_struct const *)(__gen_e_acsl__14));
+    __gmpq_init(__gen_e_acsl__15);
+    /*@ assert Eva: is_nan_or_infinite: \is_finite(__gen_e_acsl__12); */
+    __gmpq_set_d(__gen_e_acsl__15,__gen_e_acsl__12);
+    __gen_e_acsl_ne_2 = __gmpq_cmp((__e_acsl_mpq_struct const *)(__gen_e_acsl__15),
                                    (__e_acsl_mpq_struct const *)(__gen_e_acsl_add_2));
-    __e_acsl_assert(__gen_e_acsl_ne_3 != 0,(char *)"Assertion",
+    __e_acsl_assert(__gen_e_acsl_ne_2 != 0,(char *)"Assertion",
                     (char *)"main",(char *)"(double)1.1 != 1 + 0.1",20);
+    __gmpq_clear(__gen_e_acsl__11);
     __gmpq_clear(__gen_e_acsl__13);
-    __gmpq_clear(__gen_e_acsl__15);
-    __gmpq_clear(__gen_e_acsl__16);
+    __gmpq_clear(__gen_e_acsl__14);
     __gmpq_clear(__gen_e_acsl_add_2);
-    __gmpq_clear(__gen_e_acsl__17);
+    __gmpq_clear(__gen_e_acsl__15);
   }
   /*@ assert 1 + 0.1 ≡ 2 - 0.9; */
   {
+    __e_acsl_mpq_t __gen_e_acsl__16;
+    __e_acsl_mpq_t __gen_e_acsl__17;
+    __e_acsl_mpq_t __gen_e_acsl_add_3;
     __e_acsl_mpq_t __gen_e_acsl__18;
     __e_acsl_mpq_t __gen_e_acsl__19;
-    __e_acsl_mpq_t __gen_e_acsl_add_3;
-    __e_acsl_mpq_t __gen_e_acsl__20;
-    __e_acsl_mpq_t __gen_e_acsl__21;
     __e_acsl_mpq_t __gen_e_acsl_sub;
     int __gen_e_acsl_eq_3;
-    __gmpq_init(__gen_e_acsl__18);
-    __gmpq_set_str(__gen_e_acsl__18,"1",10);
-    __gmpq_init(__gen_e_acsl__19);
-    __gmpq_set_str(__gen_e_acsl__19,"01/10",10);
+    __gmpq_init(__gen_e_acsl__16);
+    __gmpq_set_str(__gen_e_acsl__16,"1",10);
+    __gmpq_init(__gen_e_acsl__17);
+    __gmpq_set_str(__gen_e_acsl__17,"01/10",10);
     __gmpq_init(__gen_e_acsl_add_3);
     __gmpq_add(__gen_e_acsl_add_3,
-               (__e_acsl_mpq_struct const *)(__gen_e_acsl__18),
-               (__e_acsl_mpq_struct const *)(__gen_e_acsl__19));
-    __gmpq_init(__gen_e_acsl__20);
-    __gmpq_set_str(__gen_e_acsl__20,"2",10);
-    __gmpq_init(__gen_e_acsl__21);
-    __gmpq_set_str(__gen_e_acsl__21,"09/10",10);
+               (__e_acsl_mpq_struct const *)(__gen_e_acsl__16),
+               (__e_acsl_mpq_struct const *)(__gen_e_acsl__17));
+    __gmpq_init(__gen_e_acsl__18);
+    __gmpq_set_str(__gen_e_acsl__18,"2",10);
+    __gmpq_init(__gen_e_acsl__19);
+    __gmpq_set_str(__gen_e_acsl__19,"09/10",10);
     __gmpq_init(__gen_e_acsl_sub);
     __gmpq_sub(__gen_e_acsl_sub,
-               (__e_acsl_mpq_struct const *)(__gen_e_acsl__20),
-               (__e_acsl_mpq_struct const *)(__gen_e_acsl__21));
+               (__e_acsl_mpq_struct const *)(__gen_e_acsl__18),
+               (__e_acsl_mpq_struct const *)(__gen_e_acsl__19));
     __gen_e_acsl_eq_3 = __gmpq_cmp((__e_acsl_mpq_struct const *)(__gen_e_acsl_add_3),
                                    (__e_acsl_mpq_struct const *)(__gen_e_acsl_sub));
     __e_acsl_assert(__gen_e_acsl_eq_3 == 0,(char *)"Assertion",
                     (char *)"main",(char *)"1 + 0.1 == 2 - 0.9",21);
+    __gmpq_clear(__gen_e_acsl__16);
+    __gmpq_clear(__gen_e_acsl__17);
+    __gmpq_clear(__gen_e_acsl_add_3);
     __gmpq_clear(__gen_e_acsl__18);
     __gmpq_clear(__gen_e_acsl__19);
-    __gmpq_clear(__gen_e_acsl_add_3);
-    __gmpq_clear(__gen_e_acsl__20);
-    __gmpq_clear(__gen_e_acsl__21);
     __gmpq_clear(__gen_e_acsl_sub);
   }
   float x = 0.2f;
@@ -189,84 +176,84 @@ int main(void)
   /*@ assert sum ≢ x * y; */
   {
     __e_acsl_mpq_t __gen_e_acsl_y;
-    __e_acsl_mpq_t __gen_e_acsl__22;
+    __e_acsl_mpq_t __gen_e_acsl__20;
     __e_acsl_mpq_t __gen_e_acsl_mul;
-    __e_acsl_mpq_t __gen_e_acsl__23;
-    int __gen_e_acsl_ne_4;
+    __e_acsl_mpq_t __gen_e_acsl__21;
+    int __gen_e_acsl_ne_3;
     __gmpq_init(__gen_e_acsl_y);
     __gmpq_set_d(__gen_e_acsl_y,(double)y);
-    __gmpq_init(__gen_e_acsl__22);
-    __gmpq_set_d(__gen_e_acsl__22,(double)x);
+    __gmpq_init(__gen_e_acsl__20);
+    __gmpq_set_d(__gen_e_acsl__20,(double)x);
     __gmpq_init(__gen_e_acsl_mul);
     __gmpq_mul(__gen_e_acsl_mul,
-               (__e_acsl_mpq_struct const *)(__gen_e_acsl__22),
+               (__e_acsl_mpq_struct const *)(__gen_e_acsl__20),
                (__e_acsl_mpq_struct const *)(__gen_e_acsl_y));
-    __gmpq_init(__gen_e_acsl__23);
-    __gmpq_set_d(__gen_e_acsl__23,(double)sum);
-    __gen_e_acsl_ne_4 = __gmpq_cmp((__e_acsl_mpq_struct const *)(__gen_e_acsl__23),
+    __gmpq_init(__gen_e_acsl__21);
+    __gmpq_set_d(__gen_e_acsl__21,(double)sum);
+    __gen_e_acsl_ne_3 = __gmpq_cmp((__e_acsl_mpq_struct const *)(__gen_e_acsl__21),
                                    (__e_acsl_mpq_struct const *)(__gen_e_acsl_mul));
-    __e_acsl_assert(__gen_e_acsl_ne_4 != 0,(char *)"Assertion",
+    __e_acsl_assert(__gen_e_acsl_ne_3 != 0,(char *)"Assertion",
                     (char *)"main",(char *)"sum != x * y",25);
     __gmpq_clear(__gen_e_acsl_y);
-    __gmpq_clear(__gen_e_acsl__22);
+    __gmpq_clear(__gen_e_acsl__20);
     __gmpq_clear(__gen_e_acsl_mul);
-    __gmpq_clear(__gen_e_acsl__23);
+    __gmpq_clear(__gen_e_acsl__21);
   }
   /*@ assert \let n = 1; 4 ≡ n + 3.0; */
   {
     int __gen_e_acsl_n;
+    __e_acsl_mpq_t __gen_e_acsl__22;
+    __e_acsl_mpq_t __gen_e_acsl__23;
     __e_acsl_mpq_t __gen_e_acsl__24;
-    __e_acsl_mpq_t __gen_e_acsl__25;
-    __e_acsl_mpq_t __gen_e_acsl__26;
     __e_acsl_mpq_t __gen_e_acsl_add_4;
     int __gen_e_acsl_eq_4;
     __gen_e_acsl_n = 1;
+    __gmpq_init(__gen_e_acsl__22);
+    __gmpq_set_str(__gen_e_acsl__22,"4",10);
+    __gmpq_init(__gen_e_acsl__23);
+    __gmpq_set_d(__gen_e_acsl__23,3.);
     __gmpq_init(__gen_e_acsl__24);
-    __gmpq_set_str(__gen_e_acsl__24,"4",10);
-    __gmpq_init(__gen_e_acsl__25);
-    __gmpq_set_d(__gen_e_acsl__25,3.);
-    __gmpq_init(__gen_e_acsl__26);
-    __gmpq_set_si(__gen_e_acsl__26,(long)__gen_e_acsl_n);
+    __gmpq_set_si(__gen_e_acsl__24,(long)__gen_e_acsl_n);
     __gmpq_init(__gen_e_acsl_add_4);
     __gmpq_add(__gen_e_acsl_add_4,
-               (__e_acsl_mpq_struct const *)(__gen_e_acsl__26),
-               (__e_acsl_mpq_struct const *)(__gen_e_acsl__25));
-    __gen_e_acsl_eq_4 = __gmpq_cmp((__e_acsl_mpq_struct const *)(__gen_e_acsl__24),
+               (__e_acsl_mpq_struct const *)(__gen_e_acsl__24),
+               (__e_acsl_mpq_struct const *)(__gen_e_acsl__23));
+    __gen_e_acsl_eq_4 = __gmpq_cmp((__e_acsl_mpq_struct const *)(__gen_e_acsl__22),
                                    (__e_acsl_mpq_struct const *)(__gen_e_acsl_add_4));
     __e_acsl_assert(__gen_e_acsl_eq_4 == 0,(char *)"Assertion",
                     (char *)"main",(char *)"\\let n = 1; 4 == n + 3.0",26);
+    __gmpq_clear(__gen_e_acsl__22);
+    __gmpq_clear(__gen_e_acsl__23);
     __gmpq_clear(__gen_e_acsl__24);
-    __gmpq_clear(__gen_e_acsl__25);
-    __gmpq_clear(__gen_e_acsl__26);
     __gmpq_clear(__gen_e_acsl_add_4);
   }
   double d = 0.1;
   __gen_e_acsl_avg(4.3,11.7);
   /*@ assert 1.1d ≢ 1 + 0.1; */
   {
-    __e_acsl_mpq_t __gen_e_acsl__27;
-    __e_acsl_mpq_t __gen_e_acsl__28;
+    __e_acsl_mpq_t __gen_e_acsl__25;
+    __e_acsl_mpq_t __gen_e_acsl__26;
     __e_acsl_mpq_t __gen_e_acsl_add_5;
-    __e_acsl_mpq_t __gen_e_acsl__29;
-    int __gen_e_acsl_ne_5;
-    __gmpq_init(__gen_e_acsl__27);
-    __gmpq_set_str(__gen_e_acsl__27,"1",10);
-    __gmpq_init(__gen_e_acsl__28);
-    __gmpq_set_str(__gen_e_acsl__28,"01/10",10);
+    __e_acsl_mpq_t __gen_e_acsl__27;
+    int __gen_e_acsl_ne_4;
+    __gmpq_init(__gen_e_acsl__25);
+    __gmpq_set_str(__gen_e_acsl__25,"1",10);
+    __gmpq_init(__gen_e_acsl__26);
+    __gmpq_set_str(__gen_e_acsl__26,"01/10",10);
     __gmpq_init(__gen_e_acsl_add_5);
     __gmpq_add(__gen_e_acsl_add_5,
-               (__e_acsl_mpq_struct const *)(__gen_e_acsl__27),
-               (__e_acsl_mpq_struct const *)(__gen_e_acsl__28));
-    __gmpq_init(__gen_e_acsl__29);
-    __gmpq_set_d(__gen_e_acsl__29,1.1);
-    __gen_e_acsl_ne_5 = __gmpq_cmp((__e_acsl_mpq_struct const *)(__gen_e_acsl__29),
+               (__e_acsl_mpq_struct const *)(__gen_e_acsl__25),
+               (__e_acsl_mpq_struct const *)(__gen_e_acsl__26));
+    __gmpq_init(__gen_e_acsl__27);
+    __gmpq_set_d(__gen_e_acsl__27,1.1);
+    __gen_e_acsl_ne_4 = __gmpq_cmp((__e_acsl_mpq_struct const *)(__gen_e_acsl__27),
                                    (__e_acsl_mpq_struct const *)(__gen_e_acsl_add_5));
-    __e_acsl_assert(__gen_e_acsl_ne_5 != 0,(char *)"Assertion",
+    __e_acsl_assert(__gen_e_acsl_ne_4 != 0,(char *)"Assertion",
                     (char *)"main",(char *)"1.1d != 1 + 0.1",32);
-    __gmpq_clear(__gen_e_acsl__27);
-    __gmpq_clear(__gen_e_acsl__28);
+    __gmpq_clear(__gen_e_acsl__25);
+    __gmpq_clear(__gen_e_acsl__26);
     __gmpq_clear(__gen_e_acsl_add_5);
-    __gmpq_clear(__gen_e_acsl__29);
+    __gmpq_clear(__gen_e_acsl__27);
   }
   __retres = 0;
   return __retres;
diff --git a/src/plugins/e-acsl/tests/gmp/oracle/reals.0.res.oracle b/src/plugins/e-acsl/tests/gmp/oracle/reals.0.res.oracle
index 5925779d7e0..2c4d33e93dd 100644
--- a/src/plugins/e-acsl/tests/gmp/oracle/reals.0.res.oracle
+++ b/src/plugins/e-acsl/tests/gmp/oracle/reals.0.res.oracle
@@ -19,37 +19,35 @@
   __e_acsl_math_INFINITY ∈ [-1.79769313486e+308 .. 1.79769313486e+308]
   __e_acsl_sound_verdict ∈ [--..--]
 [eva] using specification for function __e_acsl_memory_init
+[eva] using specification for function __e_acsl_assert
 [eva] using specification for function __gmpq_init
 [eva] using specification for function __gmpq_set_str
 [eva] using specification for function __gmpq_set_d
-[eva] using specification for function __gmpq_cmp
-[eva] using specification for function __e_acsl_assert
-[eva:alarm] tests/gmp/reals.c:14: Warning: 
-  function __e_acsl_assert: precondition got status unknown.
-[eva] using specification for function __gmpq_clear
 [eva] using specification for function __gmpq_add
+[eva] using specification for function __gmpq_cmp
 [eva:alarm] tests/gmp/reals.c:15: Warning: 
   function __e_acsl_assert: precondition got status unknown.
+[eva] using specification for function __gmpq_clear
 [eva:alarm] tests/gmp/reals.c:16: Warning: assertion got status unknown.
 [eva:alarm] tests/gmp/reals.c:16: Warning: 
   function __e_acsl_assert: precondition got status unknown.
 [eva:alarm] tests/gmp/reals.c:18: Warning: assertion got status unknown.
 [eva] using specification for function __gmpq_get_d
 [eva:alarm] tests/gmp/reals.c:18: Warning: 
-  non-finite double value. assert \is_finite(__gen_e_acsl__8);
+  non-finite double value. assert \is_finite(__gen_e_acsl__6);
 [eva:alarm] tests/gmp/reals.c:18: Warning: 
   function __e_acsl_assert: precondition got status unknown.
 [eva:alarm] tests/gmp/reals.c:19: Warning: 
-  non-finite double value. assert \is_finite(__gen_e_acsl__11);
+  non-finite double value. assert \is_finite(__gen_e_acsl__9);
 [eva:alarm] tests/gmp/reals.c:19: Warning: 
-  non-finite double value. assert \is_finite(__gen_e_acsl__12);
+  non-finite double value. assert \is_finite(__gen_e_acsl__10);
 [eva:alarm] tests/gmp/reals.c:19: Warning: 
-  non-finite float value. assert \is_finite((float)__gen_e_acsl__11);
+  non-finite float value. assert \is_finite((float)__gen_e_acsl__9);
 [eva:alarm] tests/gmp/reals.c:19: Warning: 
   function __e_acsl_assert: precondition got status unknown.
 [eva:alarm] tests/gmp/reals.c:20: Warning: assertion got status unknown.
 [eva:alarm] tests/gmp/reals.c:20: Warning: 
-  non-finite double value. assert \is_finite(__gen_e_acsl__14);
+  non-finite double value. assert \is_finite(__gen_e_acsl__12);
 [eva:alarm] tests/gmp/reals.c:20: Warning: 
   function __e_acsl_assert: precondition got status unknown.
 [eva:alarm] tests/gmp/reals.c:21: Warning: assertion got status unknown.
diff --git a/src/plugins/e-acsl/tests/gmp/oracle/reals.1.res.oracle b/src/plugins/e-acsl/tests/gmp/oracle/reals.1.res.oracle
index 5925779d7e0..2c4d33e93dd 100644
--- a/src/plugins/e-acsl/tests/gmp/oracle/reals.1.res.oracle
+++ b/src/plugins/e-acsl/tests/gmp/oracle/reals.1.res.oracle
@@ -19,37 +19,35 @@
   __e_acsl_math_INFINITY ∈ [-1.79769313486e+308 .. 1.79769313486e+308]
   __e_acsl_sound_verdict ∈ [--..--]
 [eva] using specification for function __e_acsl_memory_init
+[eva] using specification for function __e_acsl_assert
 [eva] using specification for function __gmpq_init
 [eva] using specification for function __gmpq_set_str
 [eva] using specification for function __gmpq_set_d
-[eva] using specification for function __gmpq_cmp
-[eva] using specification for function __e_acsl_assert
-[eva:alarm] tests/gmp/reals.c:14: Warning: 
-  function __e_acsl_assert: precondition got status unknown.
-[eva] using specification for function __gmpq_clear
 [eva] using specification for function __gmpq_add
+[eva] using specification for function __gmpq_cmp
 [eva:alarm] tests/gmp/reals.c:15: Warning: 
   function __e_acsl_assert: precondition got status unknown.
+[eva] using specification for function __gmpq_clear
 [eva:alarm] tests/gmp/reals.c:16: Warning: assertion got status unknown.
 [eva:alarm] tests/gmp/reals.c:16: Warning: 
   function __e_acsl_assert: precondition got status unknown.
 [eva:alarm] tests/gmp/reals.c:18: Warning: assertion got status unknown.
 [eva] using specification for function __gmpq_get_d
 [eva:alarm] tests/gmp/reals.c:18: Warning: 
-  non-finite double value. assert \is_finite(__gen_e_acsl__8);
+  non-finite double value. assert \is_finite(__gen_e_acsl__6);
 [eva:alarm] tests/gmp/reals.c:18: Warning: 
   function __e_acsl_assert: precondition got status unknown.
 [eva:alarm] tests/gmp/reals.c:19: Warning: 
-  non-finite double value. assert \is_finite(__gen_e_acsl__11);
+  non-finite double value. assert \is_finite(__gen_e_acsl__9);
 [eva:alarm] tests/gmp/reals.c:19: Warning: 
-  non-finite double value. assert \is_finite(__gen_e_acsl__12);
+  non-finite double value. assert \is_finite(__gen_e_acsl__10);
 [eva:alarm] tests/gmp/reals.c:19: Warning: 
-  non-finite float value. assert \is_finite((float)__gen_e_acsl__11);
+  non-finite float value. assert \is_finite((float)__gen_e_acsl__9);
 [eva:alarm] tests/gmp/reals.c:19: Warning: 
   function __e_acsl_assert: precondition got status unknown.
 [eva:alarm] tests/gmp/reals.c:20: Warning: assertion got status unknown.
 [eva:alarm] tests/gmp/reals.c:20: Warning: 
-  non-finite double value. assert \is_finite(__gen_e_acsl__14);
+  non-finite double value. assert \is_finite(__gen_e_acsl__12);
 [eva:alarm] tests/gmp/reals.c:20: Warning: 
   function __e_acsl_assert: precondition got status unknown.
 [eva:alarm] tests/gmp/reals.c:21: Warning: assertion got status unknown.
diff --git a/src/plugins/e-acsl/translate.ml b/src/plugins/e-acsl/translate.ml
index 82de0f17f9f..b58640843e4 100644
--- a/src/plugins/e-acsl/translate.ml
+++ b/src/plugins/e-acsl/translate.ml
@@ -156,7 +156,8 @@ let constant_to_exp ~loc t c =
      | Typing.Gmpz ->
        (* too large integer *)
        Cil.mkString ~loc (Integer.to_string n), Str_Z
-     | Typing.C_float _fkind -> assert false (* TODO RATIONAL *)
+     | Typing.C_float fkind ->
+       Cil.kfloat ~loc fkind (Int64.to_float (Integer.to_int64 n)), C_number
      | Typing.C_integer kind ->
        let cast = Typing.get_cast t in
        match cast, kind with
diff --git a/src/plugins/e-acsl/typing.ml b/src/plugins/e-acsl/typing.ml
index 774e0c22d3f..8abc13fd1cb 100644
--- a/src/plugins/e-acsl/typing.ml
+++ b/src/plugins/e-acsl/typing.ml
@@ -243,10 +243,8 @@ let ty_of_interv ?ctx = function
          (* return [ctx] type for types smaller than int to prevent superfluous
             casts in the generated code *)
          if Cil.intTypeIncluded kind ik then ctx else C_integer kind
-       | Some (C_float _ | Rational) ->
-         Rational
-       | Some Real ->
-         Real)
+       | Some (C_float _ | Rational | Real as ty) ->
+         ty)
     with Cil.Not_representable ->
       match ctx with
       | None | Some(C_integer _ | Gmpz | Nan) -> Gmpz
-- 
GitLab