From f9b2a1053b91b7f362b6dc14c7514146cd4511fb Mon Sep 17 00:00:00 2001
From: Thibaut Benjamin <thibaut.benjamin@cea.fr>
Date: Wed, 13 Oct 2021 10:03:49 +0200
Subject: [PATCH] [e-acsl] code review

---
 .../src/analyses/predicate_normalizer.ml      |   1 -
 src/plugins/e-acsl/src/analyses/typing.ml     |   2 +
 .../tests/gmp-only/extended_quantifiers.i     |  11 +-
 .../oracle/extended_quantifiers.res.oracle    |  20 +-
 .../oracle/gen_extended_quantifiers.c         | 277 +++++++++++++++---
 5 files changed, 266 insertions(+), 45 deletions(-)

diff --git a/src/plugins/e-acsl/src/analyses/predicate_normalizer.ml b/src/plugins/e-acsl/src/analyses/predicate_normalizer.ml
index 8ff2f7c5a09..46efb9de68c 100644
--- a/src/plugins/e-acsl/src/analyses/predicate_normalizer.ml
+++ b/src/plugins/e-acsl/src/analyses/predicate_normalizer.ml
@@ -134,7 +134,6 @@ let preprocess_term ~loc t =
             (Tapp(logic_info, lst, [ t1; t2; lambda_term ])) Linteger)
   | _ -> None
 
-
 let preprocessor = object
   inherit Visitor.frama_c_inplace
 
diff --git a/src/plugins/e-acsl/src/analyses/typing.ml b/src/plugins/e-acsl/src/analyses/typing.ml
index 787dd4cc249..f7159b31556 100644
--- a/src/plugins/e-acsl/src/analyses/typing.ml
+++ b/src/plugins/e-acsl/src/analyses/typing.ml
@@ -416,6 +416,8 @@ let rec type_term
     | TSizeOfStr _
     | TAlignOf _ ->
       let i = Interval.infer t in
+      (* a constant or an left value directly under a lambda should be a gmp
+      if the infered context for the lambda is gmp *)
       let ty = ty_of_interv ?ctx ~use_gmp_opt:under_lambda i in
       dup ty
 
diff --git a/src/plugins/e-acsl/tests/gmp-only/extended_quantifiers.i b/src/plugins/e-acsl/tests/gmp-only/extended_quantifiers.i
index 4d961894a25..b8da5291288 100644
--- a/src/plugins/e-acsl/tests/gmp-only/extended_quantifiers.i
+++ b/src/plugins/e-acsl/tests/gmp-only/extended_quantifiers.i
@@ -4,16 +4,13 @@
 
 int main(void) {
 
-  /* assert \sum(2, 10, \lambda integer k; 2 * k) == 108; */;
-  /* assert \sum(10, 2, \lambda integer k; k) == 0; */;
-  /* assert \sum(1, 10, \lambda integer k; 1) == 10; */;
+  /*@ assert \sum(2, 10, \lambda integer k; 2 * k) == 108; */;
+  /*@ assert \sum(1, 10, \lambda integer k; 1) == 10; */;
 
   /*@ assert \numof(2, 10, \lambda integer k; k - 2 >= 0) == 9; */;
 
-  /* assert \product(1, 10, \lambda integer k; k) == 3628800; */;
-  /* assert \product(-10, 10, \lambda integer k; k) == 0; */;
-  /* assert \product(-20, -1, \lambda integer k; 2 * k)
-         == \product(1, 20, \lambda integer k; 2 * k); */
+  /*@ assert \product(1, 10, \lambda integer k; k) == 3628800; */;
+  /*@ assert \product(-10, 10, \lambda integer k; k) == 0; */;
   ;
 
   return 0;
diff --git a/src/plugins/e-acsl/tests/gmp-only/oracle/extended_quantifiers.res.oracle b/src/plugins/e-acsl/tests/gmp-only/oracle/extended_quantifiers.res.oracle
index 25892758b26..ab3eacdf01b 100644
--- a/src/plugins/e-acsl/tests/gmp-only/oracle/extended_quantifiers.res.oracle
+++ b/src/plugins/e-acsl/tests/gmp-only/oracle/extended_quantifiers.res.oracle
@@ -1,6 +1,22 @@
 [e-acsl] beginning translation.
 [e-acsl] translation done in project "e-acsl".
-[eva:alarm] tests/gmp-only/extended_quantifiers.i:11: Warning: 
+[eva:alarm] tests/gmp-only/extended_quantifiers.i:7: Warning: 
   function __e_acsl_assert, behavior blocking: precondition got status unknown.
-[eva:alarm] tests/gmp-only/extended_quantifiers.i:11: Warning: 
+[eva:alarm] tests/gmp-only/extended_quantifiers.i:7: Warning: 
+  assertion got status unknown.
+[eva:alarm] tests/gmp-only/extended_quantifiers.i:8: Warning: 
+  function __e_acsl_assert, behavior blocking: precondition got status unknown.
+[eva:alarm] tests/gmp-only/extended_quantifiers.i:8: Warning: 
+  assertion got status unknown.
+[eva:alarm] tests/gmp-only/extended_quantifiers.i:10: Warning: 
+  function __e_acsl_assert, behavior blocking: precondition got status unknown.
+[eva:alarm] tests/gmp-only/extended_quantifiers.i:10: Warning: 
+  assertion got status unknown.
+[eva:alarm] tests/gmp-only/extended_quantifiers.i:12: Warning: 
+  function __e_acsl_assert, behavior blocking: precondition got status unknown.
+[eva:alarm] tests/gmp-only/extended_quantifiers.i:12: Warning: 
+  assertion got status unknown.
+[eva:alarm] tests/gmp-only/extended_quantifiers.i:13: Warning: 
+  function __e_acsl_assert, behavior blocking: precondition got status unknown.
+[eva:alarm] tests/gmp-only/extended_quantifiers.i:13: Warning: 
   assertion got status unknown.
diff --git a/src/plugins/e-acsl/tests/gmp-only/oracle/gen_extended_quantifiers.c b/src/plugins/e-acsl/tests/gmp-only/oracle/gen_extended_quantifiers.c
index f38b7f68218..f20f45faae5 100644
--- a/src/plugins/e-acsl/tests/gmp-only/oracle/gen_extended_quantifiers.c
+++ b/src/plugins/e-acsl/tests/gmp-only/oracle/gen_extended_quantifiers.c
@@ -14,7 +14,7 @@ int main(void)
     int __gen_e_acsl_cond;
     __e_acsl_mpz_t __gen_e_acsl_lambda;
     __e_acsl_mpz_t __gen_e_acsl_accumulator;
-    __e_acsl_mpz_t __gen_e_acsl__7;
+    __e_acsl_mpz_t __gen_e_acsl__4;
     int __gen_e_acsl_eq;
     __gmpz_init_set_si(__gen_e_acsl_,2L);
     __gmpz_init_set_si(__gen_e_acsl__2,10L);
@@ -31,38 +31,16 @@ int main(void)
       else {
         {
           __e_acsl_mpz_t __gen_e_acsl__3;
-          __e_acsl_mpz_t __gen_e_acsl_sub;
-          __e_acsl_mpz_t __gen_e_acsl__4;
-          int __gen_e_acsl_ge;
-          __e_acsl_mpz_t __gen_e_acsl_if;
+          __e_acsl_mpz_t __gen_e_acsl_mul;
           __gmpz_init_set_si(__gen_e_acsl__3,2L);
-          __gmpz_init(__gen_e_acsl_sub);
-          __gmpz_sub(__gen_e_acsl_sub,
-                     (__e_acsl_mpz_struct const *)(__gen_e_acsl_k),
-                     (__e_acsl_mpz_struct const *)(__gen_e_acsl__3));
-          __gmpz_init_set_si(__gen_e_acsl__4,0L);
-          __gen_e_acsl_ge = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_sub),
-                                       (__e_acsl_mpz_struct const *)(__gen_e_acsl__4));
-          if (__gen_e_acsl_ge >= 0) {
-            __e_acsl_mpz_t __gen_e_acsl__5;
-            __gmpz_init_set_si(__gen_e_acsl__5,1L);
-            __gmpz_init_set(__gen_e_acsl_if,
-                            (__e_acsl_mpz_struct const *)(__gen_e_acsl__5));
-            __gmpz_clear(__gen_e_acsl__5);
-          }
-          else {
-            __e_acsl_mpz_t __gen_e_acsl__6;
-            __gmpz_init_set_si(__gen_e_acsl__6,0L);
-            __gmpz_init_set(__gen_e_acsl_if,
-                            (__e_acsl_mpz_struct const *)(__gen_e_acsl__6));
-            __gmpz_clear(__gen_e_acsl__6);
-          }
+          __gmpz_init(__gen_e_acsl_mul);
+          __gmpz_mul(__gen_e_acsl_mul,
+                     (__e_acsl_mpz_struct const *)(__gen_e_acsl__3),
+                     (__e_acsl_mpz_struct const *)(__gen_e_acsl_k));
           __gmpz_set(__gen_e_acsl_lambda,
-                     (__e_acsl_mpz_struct const *)(__gen_e_acsl_if));
+                     (__e_acsl_mpz_struct const *)(__gen_e_acsl_mul));
           __gmpz_clear(__gen_e_acsl__3);
-          __gmpz_clear(__gen_e_acsl_sub);
-          __gmpz_clear(__gen_e_acsl__4);
-          __gmpz_clear(__gen_e_acsl_if);
+          __gmpz_clear(__gen_e_acsl_mul);
         }
         __gmpz_add(__gen_e_acsl_accumulator,
                    (__e_acsl_mpz_struct const *)(__gen_e_acsl_accumulator),
@@ -72,21 +50,250 @@ int main(void)
                    (__e_acsl_mpz_struct const *)(__gen_e_acsl_one));
       }
     }
-    __gmpz_init_set_si(__gen_e_acsl__7,9L);
+    __gmpz_init_set_si(__gen_e_acsl__4,108L);
     __gen_e_acsl_eq = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_accumulator),
-                                 (__e_acsl_mpz_struct const *)(__gen_e_acsl__7));
+                                 (__e_acsl_mpz_struct const *)(__gen_e_acsl__4));
     __e_acsl_assert(__gen_e_acsl_eq == 0,1,"Assertion","main",
-                    "\\numof(2, 10, \\lambda integer k; k - 2 >= 0) == 9",
-                    "tests/gmp-only/extended_quantifiers.i",11);
+                    "\\sum(2, 10, \\lambda integer k; 2 * k) == 108",
+                    "tests/gmp-only/extended_quantifiers.i",7);
     __gmpz_clear(__gen_e_acsl_);
     __gmpz_clear(__gen_e_acsl__2);
     __gmpz_clear(__gen_e_acsl_k);
     __gmpz_clear(__gen_e_acsl_one);
     __gmpz_clear(__gen_e_acsl_lambda);
     __gmpz_clear(__gen_e_acsl_accumulator);
-    __gmpz_clear(__gen_e_acsl__7);
+    __gmpz_clear(__gen_e_acsl__4);
+  }
+  /*@ assert \sum(2, 10, \lambda ℤ k; 2 * k) ≡ 108; */ ;
+  {
+    __e_acsl_mpz_t __gen_e_acsl__5;
+    __e_acsl_mpz_t __gen_e_acsl__6;
+    __e_acsl_mpz_t __gen_e_acsl_k_2;
+    __e_acsl_mpz_t __gen_e_acsl_one_2;
+    int __gen_e_acsl_cond_2;
+    __e_acsl_mpz_t __gen_e_acsl_lambda_2;
+    __e_acsl_mpz_t __gen_e_acsl_accumulator_2;
+    int __gen_e_acsl_eq_2;
+    __gmpz_init_set_si(__gen_e_acsl__5,1L);
+    __gmpz_init_set_si(__gen_e_acsl__6,10L);
+    __gmpz_init_set_si(__gen_e_acsl_one_2,1L);
+    __gen_e_acsl_cond_2 = 0;
+    __gmpz_init_set_si(__gen_e_acsl_lambda_2,0L);
+    __gmpz_init_set_si(__gen_e_acsl_accumulator_2,0L);
+    __gmpz_init_set(__gen_e_acsl_k_2,
+                    (__e_acsl_mpz_struct const *)(__gen_e_acsl__5));
+    while (1) {
+      __gen_e_acsl_cond_2 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_k_2),
+                                       (__e_acsl_mpz_struct const *)(__gen_e_acsl__6));
+      if (__gen_e_acsl_cond_2 > 0) break;
+      else {
+        {
+          __e_acsl_mpz_t __gen_e_acsl__7;
+          __gmpz_init_set_str(__gen_e_acsl__7,"1",10);
+          __gmpz_set(__gen_e_acsl_lambda_2,
+                     (__e_acsl_mpz_struct const *)(__gen_e_acsl__7));
+          __gmpz_clear(__gen_e_acsl__7);
+        }
+        __gmpz_add(__gen_e_acsl_accumulator_2,
+                   (__e_acsl_mpz_struct const *)(__gen_e_acsl_accumulator_2),
+                   (__e_acsl_mpz_struct const *)(__gen_e_acsl_lambda_2));
+        __gmpz_add(__gen_e_acsl_k_2,
+                   (__e_acsl_mpz_struct const *)(__gen_e_acsl_k_2),
+                   (__e_acsl_mpz_struct const *)(__gen_e_acsl_one_2));
+      }
+    }
+    __gen_e_acsl_eq_2 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_accumulator_2),
+                                   (__e_acsl_mpz_struct const *)(__gen_e_acsl__6));
+    __e_acsl_assert(__gen_e_acsl_eq_2 == 0,1,"Assertion","main",
+                    "\\sum(1, 10, \\lambda integer k; 1) == 10",
+                    "tests/gmp-only/extended_quantifiers.i",8);
+    __gmpz_clear(__gen_e_acsl__5);
+    __gmpz_clear(__gen_e_acsl__6);
+    __gmpz_clear(__gen_e_acsl_k_2);
+    __gmpz_clear(__gen_e_acsl_one_2);
+    __gmpz_clear(__gen_e_acsl_lambda_2);
+    __gmpz_clear(__gen_e_acsl_accumulator_2);
+  }
+  /*@ assert \sum(1, 10, \lambda ℤ k; 1) ≡ 10; */ ;
+  {
+    __e_acsl_mpz_t __gen_e_acsl__8;
+    __e_acsl_mpz_t __gen_e_acsl__9;
+    __e_acsl_mpz_t __gen_e_acsl_k_3;
+    __e_acsl_mpz_t __gen_e_acsl_one_3;
+    int __gen_e_acsl_cond_3;
+    __e_acsl_mpz_t __gen_e_acsl_lambda_3;
+    __e_acsl_mpz_t __gen_e_acsl_accumulator_3;
+    __e_acsl_mpz_t __gen_e_acsl__14;
+    int __gen_e_acsl_eq_3;
+    __gmpz_init_set_si(__gen_e_acsl__8,2L);
+    __gmpz_init_set_si(__gen_e_acsl__9,10L);
+    __gmpz_init_set_si(__gen_e_acsl_one_3,1L);
+    __gen_e_acsl_cond_3 = 0;
+    __gmpz_init_set_si(__gen_e_acsl_lambda_3,0L);
+    __gmpz_init_set_si(__gen_e_acsl_accumulator_3,0L);
+    __gmpz_init_set(__gen_e_acsl_k_3,
+                    (__e_acsl_mpz_struct const *)(__gen_e_acsl__8));
+    while (1) {
+      __gen_e_acsl_cond_3 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_k_3),
+                                       (__e_acsl_mpz_struct const *)(__gen_e_acsl__9));
+      if (__gen_e_acsl_cond_3 > 0) break;
+      else {
+        {
+          __e_acsl_mpz_t __gen_e_acsl__10;
+          __e_acsl_mpz_t __gen_e_acsl_sub;
+          __e_acsl_mpz_t __gen_e_acsl__11;
+          int __gen_e_acsl_ge;
+          __e_acsl_mpz_t __gen_e_acsl_if;
+          __gmpz_init_set_si(__gen_e_acsl__10,2L);
+          __gmpz_init(__gen_e_acsl_sub);
+          __gmpz_sub(__gen_e_acsl_sub,
+                     (__e_acsl_mpz_struct const *)(__gen_e_acsl_k_3),
+                     (__e_acsl_mpz_struct const *)(__gen_e_acsl__10));
+          __gmpz_init_set_si(__gen_e_acsl__11,0L);
+          __gen_e_acsl_ge = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_sub),
+                                       (__e_acsl_mpz_struct const *)(__gen_e_acsl__11));
+          if (__gen_e_acsl_ge >= 0) {
+            __e_acsl_mpz_t __gen_e_acsl__12;
+            __gmpz_init_set_si(__gen_e_acsl__12,1L);
+            __gmpz_init_set(__gen_e_acsl_if,
+                            (__e_acsl_mpz_struct const *)(__gen_e_acsl__12));
+            __gmpz_clear(__gen_e_acsl__12);
+          }
+          else {
+            __e_acsl_mpz_t __gen_e_acsl__13;
+            __gmpz_init_set_si(__gen_e_acsl__13,0L);
+            __gmpz_init_set(__gen_e_acsl_if,
+                            (__e_acsl_mpz_struct const *)(__gen_e_acsl__13));
+            __gmpz_clear(__gen_e_acsl__13);
+          }
+          __gmpz_set(__gen_e_acsl_lambda_3,
+                     (__e_acsl_mpz_struct const *)(__gen_e_acsl_if));
+          __gmpz_clear(__gen_e_acsl__10);
+          __gmpz_clear(__gen_e_acsl_sub);
+          __gmpz_clear(__gen_e_acsl__11);
+          __gmpz_clear(__gen_e_acsl_if);
+        }
+        __gmpz_add(__gen_e_acsl_accumulator_3,
+                   (__e_acsl_mpz_struct const *)(__gen_e_acsl_accumulator_3),
+                   (__e_acsl_mpz_struct const *)(__gen_e_acsl_lambda_3));
+        __gmpz_add(__gen_e_acsl_k_3,
+                   (__e_acsl_mpz_struct const *)(__gen_e_acsl_k_3),
+                   (__e_acsl_mpz_struct const *)(__gen_e_acsl_one_3));
+      }
+    }
+    __gmpz_init_set_si(__gen_e_acsl__14,9L);
+    __gen_e_acsl_eq_3 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_accumulator_3),
+                                   (__e_acsl_mpz_struct const *)(__gen_e_acsl__14));
+    __e_acsl_assert(__gen_e_acsl_eq_3 == 0,1,"Assertion","main",
+                    "\\numof(2, 10, \\lambda integer k; k - 2 >= 0) == 9",
+                    "tests/gmp-only/extended_quantifiers.i",10);
+    __gmpz_clear(__gen_e_acsl__8);
+    __gmpz_clear(__gen_e_acsl__9);
+    __gmpz_clear(__gen_e_acsl_k_3);
+    __gmpz_clear(__gen_e_acsl_one_3);
+    __gmpz_clear(__gen_e_acsl_lambda_3);
+    __gmpz_clear(__gen_e_acsl_accumulator_3);
+    __gmpz_clear(__gen_e_acsl__14);
   }
   /*@ assert \numof(2, 10, \lambda ℤ k; k - 2 ≥ 0) ≡ 9; */ ;
+  {
+    __e_acsl_mpz_t __gen_e_acsl__15;
+    __e_acsl_mpz_t __gen_e_acsl__16;
+    __e_acsl_mpz_t __gen_e_acsl_k_4;
+    __e_acsl_mpz_t __gen_e_acsl_one_4;
+    int __gen_e_acsl_cond_4;
+    __e_acsl_mpz_t __gen_e_acsl_lambda_4;
+    __e_acsl_mpz_t __gen_e_acsl_accumulator_4;
+    __e_acsl_mpz_t __gen_e_acsl__17;
+    int __gen_e_acsl_eq_4;
+    __gmpz_init_set_si(__gen_e_acsl__15,1L);
+    __gmpz_init_set_si(__gen_e_acsl__16,10L);
+    __gmpz_init_set_si(__gen_e_acsl_one_4,1L);
+    __gen_e_acsl_cond_4 = 0;
+    __gmpz_init_set_si(__gen_e_acsl_lambda_4,0L);
+    __gmpz_init_set_si(__gen_e_acsl_accumulator_4,1L);
+    __gmpz_init_set(__gen_e_acsl_k_4,
+                    (__e_acsl_mpz_struct const *)(__gen_e_acsl__15));
+    while (1) {
+      __gen_e_acsl_cond_4 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_k_4),
+                                       (__e_acsl_mpz_struct const *)(__gen_e_acsl__16));
+      if (__gen_e_acsl_cond_4 > 0) break;
+      else {
+        __gmpz_set(__gen_e_acsl_lambda_4,
+                   (__e_acsl_mpz_struct const *)(__gen_e_acsl_k_4));
+        __gmpz_mul(__gen_e_acsl_accumulator_4,
+                   (__e_acsl_mpz_struct const *)(__gen_e_acsl_accumulator_4),
+                   (__e_acsl_mpz_struct const *)(__gen_e_acsl_lambda_4));
+        __gmpz_add(__gen_e_acsl_k_4,
+                   (__e_acsl_mpz_struct const *)(__gen_e_acsl_k_4),
+                   (__e_acsl_mpz_struct const *)(__gen_e_acsl_one_4));
+      }
+    }
+    __gmpz_init_set_ui(__gen_e_acsl__17,3628800UL);
+    __gen_e_acsl_eq_4 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_accumulator_4),
+                                   (__e_acsl_mpz_struct const *)(__gen_e_acsl__17));
+    __e_acsl_assert(__gen_e_acsl_eq_4 == 0,1,"Assertion","main",
+                    "\\product(1, 10, \\lambda integer k; k) == 3628800",
+                    "tests/gmp-only/extended_quantifiers.i",12);
+    __gmpz_clear(__gen_e_acsl__15);
+    __gmpz_clear(__gen_e_acsl__16);
+    __gmpz_clear(__gen_e_acsl_k_4);
+    __gmpz_clear(__gen_e_acsl_one_4);
+    __gmpz_clear(__gen_e_acsl_lambda_4);
+    __gmpz_clear(__gen_e_acsl_accumulator_4);
+    __gmpz_clear(__gen_e_acsl__17);
+  }
+  /*@ assert \product(1, 10, \lambda ℤ k; k) ≡ 3628800; */ ;
+  {
+    __e_acsl_mpz_t __gen_e_acsl__18;
+    __e_acsl_mpz_t __gen_e_acsl_neg;
+    __e_acsl_mpz_t __gen_e_acsl_k_5;
+    __e_acsl_mpz_t __gen_e_acsl_one_5;
+    int __gen_e_acsl_cond_5;
+    __e_acsl_mpz_t __gen_e_acsl_lambda_5;
+    __e_acsl_mpz_t __gen_e_acsl_accumulator_5;
+    __e_acsl_mpz_t __gen_e_acsl__19;
+    int __gen_e_acsl_eq_5;
+    __gmpz_init_set_si(__gen_e_acsl__18,10L);
+    __gmpz_init(__gen_e_acsl_neg);
+    __gmpz_neg(__gen_e_acsl_neg,
+               (__e_acsl_mpz_struct const *)(__gen_e_acsl__18));
+    __gmpz_init_set_si(__gen_e_acsl_one_5,1L);
+    __gen_e_acsl_cond_5 = 0;
+    __gmpz_init_set_si(__gen_e_acsl_lambda_5,0L);
+    __gmpz_init_set_si(__gen_e_acsl_accumulator_5,1L);
+    __gmpz_init_set(__gen_e_acsl_k_5,
+                    (__e_acsl_mpz_struct const *)(__gen_e_acsl_neg));
+    while (1) {
+      __gen_e_acsl_cond_5 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_k_5),
+                                       (__e_acsl_mpz_struct const *)(__gen_e_acsl__18));
+      if (__gen_e_acsl_cond_5 > 0) break;
+      else {
+        __gmpz_set(__gen_e_acsl_lambda_5,
+                   (__e_acsl_mpz_struct const *)(__gen_e_acsl_k_5));
+        __gmpz_mul(__gen_e_acsl_accumulator_5,
+                   (__e_acsl_mpz_struct const *)(__gen_e_acsl_accumulator_5),
+                   (__e_acsl_mpz_struct const *)(__gen_e_acsl_lambda_5));
+        __gmpz_add(__gen_e_acsl_k_5,
+                   (__e_acsl_mpz_struct const *)(__gen_e_acsl_k_5),
+                   (__e_acsl_mpz_struct const *)(__gen_e_acsl_one_5));
+      }
+    }
+    __gmpz_init_set_si(__gen_e_acsl__19,0L);
+    __gen_e_acsl_eq_5 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_accumulator_5),
+                                   (__e_acsl_mpz_struct const *)(__gen_e_acsl__19));
+    __e_acsl_assert(__gen_e_acsl_eq_5 == 0,1,"Assertion","main",
+                    "\\product(-10, 10, \\lambda integer k; k) == 0",
+                    "tests/gmp-only/extended_quantifiers.i",13);
+    __gmpz_clear(__gen_e_acsl__18);
+    __gmpz_clear(__gen_e_acsl_neg);
+    __gmpz_clear(__gen_e_acsl_k_5);
+    __gmpz_clear(__gen_e_acsl_one_5);
+    __gmpz_clear(__gen_e_acsl_lambda_5);
+    __gmpz_clear(__gen_e_acsl_accumulator_5);
+    __gmpz_clear(__gen_e_acsl__19);
+  }
+  /*@ assert \product(-10, 10, \lambda ℤ k; k) ≡ 0; */ ;
   __retres = 0;
   return __retres;
 }
-- 
GitLab