diff --git a/src/plugins/e-acsl/tests/gmp/oracle/gen_let2.c b/src/plugins/e-acsl/tests/gmp/oracle/gen_let2.c
index 96b37ea579d10fb9ea0959581868b8470c0230a7..4acc2f23cf50d7be0abb7034d5ff566ceec296ae 100644
--- a/src/plugins/e-acsl/tests/gmp/oracle/gen_let2.c
+++ b/src/plugins/e-acsl/tests/gmp/oracle/gen_let2.c
@@ -79,156 +79,156 @@ int main(void)
   /*@ assert (\let u = 1; u) + 1 ≡ 2; */
   {
     int __gen_e_acsl_u_3;
+    __e_acsl_mpz_t __gen_e_acsl_u_4;
     __e_acsl_mpz_t __gen_e_acsl__4;
-    __e_acsl_mpz_t __gen_e_acsl__5;
     __e_acsl_mpz_t __gen_e_acsl_add_2;
-    __e_acsl_mpz_t __gen_e_acsl__6;
+    __e_acsl_mpz_t __gen_e_acsl__5;
     int __gen_e_acsl_eq;
     __gen_e_acsl_u_3 = 1;
-    __gmpz_init_set_si(__gen_e_acsl__4,(long)__gen_e_acsl_u_3);
-    __gmpz_init_set_si(__gen_e_acsl__5,1L);
+    __gmpz_init_set_si(__gen_e_acsl_u_4,(long)__gen_e_acsl_u_3);
+    __gmpz_init_set_si(__gen_e_acsl__4,1L);
     __gmpz_init(__gen_e_acsl_add_2);
     __gmpz_add(__gen_e_acsl_add_2,
-               (__e_acsl_mpz_struct const *)(__gen_e_acsl__4),
-               (__e_acsl_mpz_struct const *)(__gen_e_acsl__5));
-    __gmpz_init_set_si(__gen_e_acsl__6,2L);
+               (__e_acsl_mpz_struct const *)(__gen_e_acsl_u_4),
+               (__e_acsl_mpz_struct const *)(__gen_e_acsl__4));
+    __gmpz_init_set_si(__gen_e_acsl__5,2L);
     __gen_e_acsl_eq = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_add_2),
-                                 (__e_acsl_mpz_struct const *)(__gen_e_acsl__6));
+                                 (__e_acsl_mpz_struct const *)(__gen_e_acsl__5));
     __e_acsl_assert(__gen_e_acsl_eq == 0,(char *)"Assertion",(char *)"main",
                     (char *)"(\\let u = 1; u) + 1 == 2",12);
+    __gmpz_clear(__gen_e_acsl_u_4);
     __gmpz_clear(__gen_e_acsl__4);
-    __gmpz_clear(__gen_e_acsl__5);
     __gmpz_clear(__gen_e_acsl_add_2);
-    __gmpz_clear(__gen_e_acsl__6);
+    __gmpz_clear(__gen_e_acsl__5);
   }
   /*@ assert \let u = 1; (\let v = u + 1; v) ≡ 2; */
   {
-    int __gen_e_acsl_u_4;
+    int __gen_e_acsl_u_5;
     __e_acsl_mpz_t __gen_e_acsl_v_2;
-    __e_acsl_mpz_t __gen_e_acsl_u_5;
-    __e_acsl_mpz_t __gen_e_acsl__7;
+    __e_acsl_mpz_t __gen_e_acsl_u_6;
+    __e_acsl_mpz_t __gen_e_acsl__6;
     __e_acsl_mpz_t __gen_e_acsl_add_3;
-    __e_acsl_mpz_t __gen_e_acsl__8;
+    __e_acsl_mpz_t __gen_e_acsl__7;
     int __gen_e_acsl_eq_2;
-    __gen_e_acsl_u_4 = 1;
-    __gmpz_init_set_si(__gen_e_acsl_u_5,(long)__gen_e_acsl_u_4);
-    __gmpz_init_set_si(__gen_e_acsl__7,1L);
+    __gen_e_acsl_u_5 = 1;
+    __gmpz_init_set_si(__gen_e_acsl_u_6,(long)__gen_e_acsl_u_5);
+    __gmpz_init_set_si(__gen_e_acsl__6,1L);
     __gmpz_init(__gen_e_acsl_add_3);
     __gmpz_add(__gen_e_acsl_add_3,
-               (__e_acsl_mpz_struct const *)(__gen_e_acsl_u_5),
-               (__e_acsl_mpz_struct const *)(__gen_e_acsl__7));
+               (__e_acsl_mpz_struct const *)(__gen_e_acsl_u_6),
+               (__e_acsl_mpz_struct const *)(__gen_e_acsl__6));
     __gmpz_init_set(__gen_e_acsl_v_2,
                     (__e_acsl_mpz_struct const *)(__gen_e_acsl_add_3));
-    __gmpz_init_set_si(__gen_e_acsl__8,2L);
+    __gmpz_init_set_si(__gen_e_acsl__7,2L);
     __gen_e_acsl_eq_2 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_v_2),
-                                   (__e_acsl_mpz_struct const *)(__gen_e_acsl__8));
+                                   (__e_acsl_mpz_struct const *)(__gen_e_acsl__7));
     __e_acsl_assert(__gen_e_acsl_eq_2 == 0,(char *)"Assertion",
                     (char *)"main",
                     (char *)"\\let u = 1; (\\let v = u + 1; v) == 2",14);
     __gmpz_clear(__gen_e_acsl_v_2);
-    __gmpz_clear(__gen_e_acsl_u_5);
-    __gmpz_clear(__gen_e_acsl__7);
+    __gmpz_clear(__gen_e_acsl_u_6);
+    __gmpz_clear(__gen_e_acsl__6);
     __gmpz_clear(__gen_e_acsl_add_3);
-    __gmpz_clear(__gen_e_acsl__8);
+    __gmpz_clear(__gen_e_acsl__7);
   }
   /*@ assert \let u = 1; (\let u = u + 1; u) ≡ 2; */
   {
-    int __gen_e_acsl_u_6;
-    __e_acsl_mpz_t __gen_e_acsl_u_7;
+    int __gen_e_acsl_u_7;
     __e_acsl_mpz_t __gen_e_acsl_u_8;
-    __e_acsl_mpz_t __gen_e_acsl__9;
+    __e_acsl_mpz_t __gen_e_acsl_u_9;
+    __e_acsl_mpz_t __gen_e_acsl__8;
     __e_acsl_mpz_t __gen_e_acsl_add_4;
-    __e_acsl_mpz_t __gen_e_acsl__10;
+    __e_acsl_mpz_t __gen_e_acsl__9;
     int __gen_e_acsl_eq_3;
-    __gen_e_acsl_u_6 = 1;
-    __gmpz_init_set_si(__gen_e_acsl_u_8,(long)__gen_e_acsl_u_6);
-    __gmpz_init_set_si(__gen_e_acsl__9,1L);
+    __gen_e_acsl_u_7 = 1;
+    __gmpz_init_set_si(__gen_e_acsl_u_9,(long)__gen_e_acsl_u_7);
+    __gmpz_init_set_si(__gen_e_acsl__8,1L);
     __gmpz_init(__gen_e_acsl_add_4);
     __gmpz_add(__gen_e_acsl_add_4,
-               (__e_acsl_mpz_struct const *)(__gen_e_acsl_u_8),
-               (__e_acsl_mpz_struct const *)(__gen_e_acsl__9));
-    __gmpz_init_set(__gen_e_acsl_u_7,
+               (__e_acsl_mpz_struct const *)(__gen_e_acsl_u_9),
+               (__e_acsl_mpz_struct const *)(__gen_e_acsl__8));
+    __gmpz_init_set(__gen_e_acsl_u_8,
                     (__e_acsl_mpz_struct const *)(__gen_e_acsl_add_4));
-    __gmpz_init_set_si(__gen_e_acsl__10,2L);
-    __gen_e_acsl_eq_3 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_u_7),
-                                   (__e_acsl_mpz_struct const *)(__gen_e_acsl__10));
+    __gmpz_init_set_si(__gen_e_acsl__9,2L);
+    __gen_e_acsl_eq_3 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_u_8),
+                                   (__e_acsl_mpz_struct const *)(__gen_e_acsl__9));
     __e_acsl_assert(__gen_e_acsl_eq_3 == 0,(char *)"Assertion",
                     (char *)"main",
                     (char *)"\\let u = 1; (\\let u = u + 1; u) == 2",17);
-    __gmpz_clear(__gen_e_acsl_u_7);
     __gmpz_clear(__gen_e_acsl_u_8);
-    __gmpz_clear(__gen_e_acsl__9);
+    __gmpz_clear(__gen_e_acsl_u_9);
+    __gmpz_clear(__gen_e_acsl__8);
     __gmpz_clear(__gen_e_acsl_add_4);
-    __gmpz_clear(__gen_e_acsl__10);
+    __gmpz_clear(__gen_e_acsl__9);
   }
   long m = 0x7fffffffffffffffL;
   /*@ assert (\let u = m; u * u) > m; */
   {
-    long __gen_e_acsl_u_9;
-    __e_acsl_mpz_t __gen_e_acsl_u_10;
+    long __gen_e_acsl_u_10;
+    __e_acsl_mpz_t __gen_e_acsl_u_11;
     __e_acsl_mpz_t __gen_e_acsl_mul_3;
     __e_acsl_mpz_t __gen_e_acsl_m;
     int __gen_e_acsl_gt_2;
-    __gen_e_acsl_u_9 = m;
-    __gmpz_init_set_si(__gen_e_acsl_u_10,__gen_e_acsl_u_9);
+    __gen_e_acsl_u_10 = m;
+    __gmpz_init_set_si(__gen_e_acsl_u_11,__gen_e_acsl_u_10);
     __gmpz_init(__gen_e_acsl_mul_3);
     __gmpz_mul(__gen_e_acsl_mul_3,
-               (__e_acsl_mpz_struct const *)(__gen_e_acsl_u_10),
-               (__e_acsl_mpz_struct const *)(__gen_e_acsl_u_10));
+               (__e_acsl_mpz_struct const *)(__gen_e_acsl_u_11),
+               (__e_acsl_mpz_struct const *)(__gen_e_acsl_u_11));
     __gmpz_init_set_si(__gen_e_acsl_m,m);
     __gen_e_acsl_gt_2 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_mul_3),
                                    (__e_acsl_mpz_struct const *)(__gen_e_acsl_m));
     __e_acsl_assert(__gen_e_acsl_gt_2 > 0,(char *)"Assertion",(char *)"main",
                     (char *)"(\\let u = m; u * u) > m",21);
-    __gmpz_clear(__gen_e_acsl_u_10);
+    __gmpz_clear(__gen_e_acsl_u_11);
     __gmpz_clear(__gen_e_acsl_mul_3);
     __gmpz_clear(__gen_e_acsl_m);
   }
   char c = (char)'a';
   /*@ assert \let u = 'b'; c < u; */
   {
-    int __gen_e_acsl_u_11;
+    int __gen_e_acsl_u_12;
     __e_acsl_mpz_t __gen_e_acsl_c;
-    __e_acsl_mpz_t __gen_e_acsl_u_12;
+    __e_acsl_mpz_t __gen_e_acsl_u_13;
     int __gen_e_acsl_lt;
-    __gen_e_acsl_u_11 = 'b';
+    __gen_e_acsl_u_12 = 'b';
     __gmpz_init_set_si(__gen_e_acsl_c,(long)c);
-    __gmpz_init_set_si(__gen_e_acsl_u_12,(long)__gen_e_acsl_u_11);
+    __gmpz_init_set_si(__gen_e_acsl_u_13,(long)__gen_e_acsl_u_12);
     __gen_e_acsl_lt = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_c),
-                                 (__e_acsl_mpz_struct const *)(__gen_e_acsl_u_12));
+                                 (__e_acsl_mpz_struct const *)(__gen_e_acsl_u_13));
     __e_acsl_assert(__gen_e_acsl_lt < 0,(char *)"Assertion",(char *)"main",
                     (char *)"\\let u = \'b\'; c < u",24);
     __gmpz_clear(__gen_e_acsl_c);
-    __gmpz_clear(__gen_e_acsl_u_12);
+    __gmpz_clear(__gen_e_acsl_u_13);
   }
   float f = 1.0f;
   __e_acsl_store_block((void *)(& f),(size_t)4);
   __e_acsl_full_init((void *)(& f));
   /*@ assert \let u = f; u ≡ f; */
   {
-    float __gen_e_acsl_u_13;
-    __gen_e_acsl_u_13 = f;
-    __e_acsl_assert(__gen_e_acsl_u_13 == f,(char *)"Assertion",
+    float __gen_e_acsl_u_14;
+    __gen_e_acsl_u_14 = f;
+    __e_acsl_assert(__gen_e_acsl_u_14 == f,(char *)"Assertion",
                     (char *)"main",(char *)"\\let u = f; u == f",27);
   }
   int t[4] = {1, 2, 3, 4};
   /*@ assert \let u = &t[1]; 1 ≡ 1; */
   {
-    int * /*[4]*/ __gen_e_acsl_u_14;
-    __e_acsl_mpz_t __gen_e_acsl__11;
+    int * /*[4]*/ __gen_e_acsl_u_15;
+    __e_acsl_mpz_t __gen_e_acsl__10;
     int __gen_e_acsl_eq_4;
-    __gen_e_acsl_u_14 = & t[1];
-    __gmpz_init_set_si(__gen_e_acsl__11,1L);
-    __gen_e_acsl_eq_4 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl__11),
-                                   (__e_acsl_mpz_struct const *)(__gen_e_acsl__11));
+    __gen_e_acsl_u_15 = & t[1];
+    __gmpz_init_set_si(__gen_e_acsl__10,1L);
+    __gen_e_acsl_eq_4 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl__10),
+                                   (__e_acsl_mpz_struct const *)(__gen_e_acsl__10));
     __e_acsl_assert(__gen_e_acsl_eq_4 == 0,(char *)"Assertion",
                     (char *)"main",(char *)"\\let u = &t[1]; 1 == 1",30);
-    __gmpz_clear(__gen_e_acsl__11);
+    __gmpz_clear(__gen_e_acsl__10);
   }
   /*@ assert (\let u = &t[1]; 1) ≡ 1; */
   {
-    int * /*[4]*/ __gen_e_acsl_u_15;
-    __gen_e_acsl_u_15 = & t[1];
+    int * /*[4]*/ __gen_e_acsl_u_16;
+    __gen_e_acsl_u_16 = & t[1];
     __e_acsl_assert(1,(char *)"Assertion",(char *)"main",
                     (char *)"(\\let u = &t[1]; 1) == 1",32);
   }
@@ -237,35 +237,35 @@ int main(void)
   __e_acsl_full_init((void *)(& r));
   /*@ assert \let u = r; u.x + u.y ≡ 3; */
   {
-    struct __anonstruct_r_1 __gen_e_acsl_u_16;
+    struct __anonstruct_r_1 __gen_e_acsl_u_17;
+    __e_acsl_mpz_t __gen_e_acsl__11;
     __e_acsl_mpz_t __gen_e_acsl__12;
-    __e_acsl_mpz_t __gen_e_acsl__13;
     __e_acsl_mpz_t __gen_e_acsl_add_5;
-    __e_acsl_mpz_t __gen_e_acsl__14;
+    __e_acsl_mpz_t __gen_e_acsl__13;
     int __gen_e_acsl_eq_5;
-    __gen_e_acsl_u_16 = r;
-    __gmpz_init_set_si(__gen_e_acsl__12,(long)__gen_e_acsl_u_16.x);
-    __gmpz_init_set_si(__gen_e_acsl__13,(long)__gen_e_acsl_u_16.y);
+    __gen_e_acsl_u_17 = r;
+    __gmpz_init_set_si(__gen_e_acsl__11,(long)__gen_e_acsl_u_17.x);
+    __gmpz_init_set_si(__gen_e_acsl__12,(long)__gen_e_acsl_u_17.y);
     __gmpz_init(__gen_e_acsl_add_5);
     __gmpz_add(__gen_e_acsl_add_5,
-               (__e_acsl_mpz_struct const *)(__gen_e_acsl__12),
-               (__e_acsl_mpz_struct const *)(__gen_e_acsl__13));
-    __gmpz_init_set_si(__gen_e_acsl__14,3L);
+               (__e_acsl_mpz_struct const *)(__gen_e_acsl__11),
+               (__e_acsl_mpz_struct const *)(__gen_e_acsl__12));
+    __gmpz_init_set_si(__gen_e_acsl__13,3L);
     __gen_e_acsl_eq_5 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_add_5),
-                                   (__e_acsl_mpz_struct const *)(__gen_e_acsl__14));
+                                   (__e_acsl_mpz_struct const *)(__gen_e_acsl__13));
     __e_acsl_assert(__gen_e_acsl_eq_5 == 0,(char *)"Assertion",
                     (char *)"main",(char *)"\\let u = r; u.x + u.y == 3",35);
+    __gmpz_clear(__gen_e_acsl__11);
     __gmpz_clear(__gen_e_acsl__12);
-    __gmpz_clear(__gen_e_acsl__13);
     __gmpz_clear(__gen_e_acsl_add_5);
-    __gmpz_clear(__gen_e_acsl__14);
+    __gmpz_clear(__gen_e_acsl__13);
   }
   s.x = 5;
   /*@ assert (\let u = s; u.x) > 0; */
   {
-    union __anonunion_s_2 __gen_e_acsl_u_17;
-    __gen_e_acsl_u_17 = s;
-    __e_acsl_assert(__gen_e_acsl_u_17.x > 0,(char *)"Assertion",
+    union __anonunion_s_2 __gen_e_acsl_u_18;
+    __gen_e_acsl_u_18 = s;
+    __e_acsl_assert(__gen_e_acsl_u_18.x > 0,(char *)"Assertion",
                     (char *)"main",(char *)"(\\let u = s; u.x) > 0",39);
   }
   __retres = 0;
diff --git a/src/plugins/e-acsl/typing.ml b/src/plugins/e-acsl/typing.ml
index e1115ea839a39602c767ea1ade28fa445a9f4e70..67c14e38f65f239a8c54deb7f040c960c7689447 100644
--- a/src/plugins/e-acsl/typing.ml
+++ b/src/plugins/e-acsl/typing.ml
@@ -477,7 +477,7 @@ let rec type_term ~use_gmp_opt ?(arith_operand=false) ?ctx t =
       infer_if_integer li;
       let li_t = Misc.term_of_li li in
       ignore (type_term ~use_gmp_opt:true li_t);
-      dup (type_term ~use_gmp_opt:true t).ty
+      dup (type_term ~use_gmp_opt:true ?ctx t).ty
     | Tlambda (_,_) -> Error.not_yet "lambda"
     | TDataCons (_,_) -> Error.not_yet "datacons"
     | TUpdate (_,_,_) -> Error.not_yet "update"