]> git.ipfire.org Git - thirdparty/gnulib.git/commitdiff
intprops-tests: new boundary tests
authorPaul Eggert <eggert@cs.ucla.edu>
Wed, 13 May 2026 22:21:12 +0000 (15:21 -0700)
committerPaul Eggert <eggert@cs.ucla.edu>
Thu, 14 May 2026 01:48:23 +0000 (18:48 -0700)
* tests/test-intprops.c (CHECK_BOUNDARIES): New macro,
implementing more tests.

ChangeLog
tests/test-intprops.c

index 4cbf28d45a12f80210a588d0742be4748c086839..0047b638f8eda7ff9f78a3828ac5b07b88746d40 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2026-05-13  Paul Eggert  <eggert@cs.ucla.edu>
+
+       intprops-tests: new boundary tests
+       * tests/test-intprops.c (CHECK_BOUNDARIES): New macro,
+       implementing more tests.
+
 2026-05-13  Bruno Haible  <bruno@clisp.org>
 
        intprops: Fix compilation error in MSVC.
index e3bdecd26c48d2eaea1d32ad86c7e9ea9fdcc13f..1e90e21c6ed5a6c95e26ff66a6cab7ab2d1777a2 100644 (file)
@@ -266,6 +266,50 @@ main (void)
   CHECK_BINOP (<<, LEFT_SHIFT, UINT_MAX / 2, 1, unsigned int, false,
                (UINT_MAX / 2) << 1);
 
+  /* INT_<op>_WRAPV at boundaries.  */
+  #define CHECK_BOUNDARIES(t, min, max)                                 \
+    {                                                                   \
+      t result;                                                         \
+      ASSERT ( INT_ADD_WRAPV (min, -1, &result));                       \
+      ASSERT (!INT_ADD_WRAPV (min,  0, &result) && result == (min));    \
+      ASSERT (!INT_ADD_WRAPV (min,  1, &result) && result == (min) + 1); \
+      ASSERT (!INT_ADD_WRAPV (max, -1, &result) && result == (max) - 1); \
+      ASSERT (!INT_ADD_WRAPV (max,  0, &result) && result == (max));    \
+      ASSERT ( INT_ADD_WRAPV (max,  1, &result));                       \
+      ASSERT (!INT_SUBTRACT_WRAPV (min, -1, &result) && result == (min) + 1); \
+      ASSERT (!INT_SUBTRACT_WRAPV (min,  0, &result) && result == (min)); \
+      ASSERT ( INT_SUBTRACT_WRAPV (min,  1, &result));                  \
+      ASSERT ( INT_SUBTRACT_WRAPV (max, -1, &result));                  \
+      ASSERT (!INT_SUBTRACT_WRAPV (max,  0, &result) && result == (max)); \
+      ASSERT (!INT_SUBTRACT_WRAPV (max,  1, &result) && result == (max) - 1); \
+      ASSERT (INT_MULTIPLY_WRAPV (min, -1, &result)                     \
+              ? (min) && (min) < -(max)                                 \
+              : ! (result + (min)));                                    \
+      ASSERT (!INT_MULTIPLY_WRAPV (min,  0, &result) && !result);       \
+      ASSERT (!INT_MULTIPLY_WRAPV (min,  1, &result) && result == (min)); \
+      ASSERT (INT_MULTIPLY_WRAPV (min,  2, &result) ? (min) < 0 : !result); \
+      ASSERT (INT_MULTIPLY_WRAPV (max, -1, &result)                     \
+              ? !(min)                                                  \
+              : ! (result + (max)));                                    \
+      ASSERT (!INT_MULTIPLY_WRAPV (max,  0, &result) && !result);       \
+      ASSERT (!INT_MULTIPLY_WRAPV (max,  1, &result) && result == (max)); \
+      ASSERT ( INT_MULTIPLY_WRAPV (max,  2, &result));                  \
+    }
+  /* CHECK_BOUNDARIES (bool, false, true); // not supported */
+  /* CHECK_BOUNDARIES (char, CHAR_MIN, CHAR_MAX); // not supported */
+  CHECK_BOUNDARIES (signed char, SCHAR_MIN, SCHAR_MAX);
+  CHECK_BOUNDARIES (unsigned char, 0, UCHAR_MAX);
+  CHECK_BOUNDARIES (short int, SHRT_MIN, SHRT_MAX);
+  CHECK_BOUNDARIES (unsigned short int, 0, USHRT_MAX);
+  CHECK_BOUNDARIES (int, INT_MIN, INT_MAX);
+  CHECK_BOUNDARIES (unsigned int, 0, UINT_MAX);
+  CHECK_BOUNDARIES (long int, LONG_MIN, LONG_MAX);
+  CHECK_BOUNDARIES (unsigned long int, 0, ULONG_MAX);
+  #ifdef LLONG_MAX
+    CHECK_BOUNDARIES (long long int, LLONG_MIN, LLONG_MAX);
+    CHECK_BOUNDARIES (unsigned long long int, 0, ULLONG_MAX);
+  #endif
+
   /* INT_<op>_OVERFLOW and INT_<op>_WRAPV with mixed types.  */
   #define CHECK_SUM(a, b, t, v, vres)                                     \
     CHECK_SUM1 (a, b, t, v, vres);                                        \