From: Paul Eggert Date: Wed, 13 May 2026 22:21:12 +0000 (-0700) Subject: intprops-tests: new boundary tests X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2399cd009aa2c8c5d02edab616cd17f3e457885f;p=thirdparty%2Fgnulib.git intprops-tests: new boundary tests * tests/test-intprops.c (CHECK_BOUNDARIES): New macro, implementing more tests. --- diff --git a/ChangeLog b/ChangeLog index 4cbf28d45a..0047b638f8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2026-05-13 Paul Eggert + + intprops-tests: new boundary tests + * tests/test-intprops.c (CHECK_BOUNDARIES): New macro, + implementing more tests. + 2026-05-13 Bruno Haible intprops: Fix compilation error in MSVC. diff --git a/tests/test-intprops.c b/tests/test-intprops.c index e3bdecd26c..1e90e21c6e 100644 --- a/tests/test-intprops.c +++ b/tests/test-intprops.c @@ -266,6 +266,50 @@ main (void) CHECK_BINOP (<<, LEFT_SHIFT, UINT_MAX / 2, 1, unsigned int, false, (UINT_MAX / 2) << 1); + /* INT__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__OVERFLOW and INT__WRAPV with mixed types. */ #define CHECK_SUM(a, b, t, v, vres) \ CHECK_SUM1 (a, b, t, v, vres); \