kit

kit
git clone https://git.ryansepassi.com/git/kit.git
Log | Files | Refs | README

builtin_26_sadd_overflow.c (3482B)


      1 int test_main(void) {
      2   int r = 0;
      3   unsigned ur = 0;
      4   long long llr = 0;
      5   unsigned long long ullr = 0;
      6   long long ll_hi = 4611686018427387904LL;
      7   unsigned long long ull_hi = 9223372036854775808ULL;
      8   long long ll_max = 9223372036854775807LL;
      9   long long ll_min = (long long)9223372036854775808ULL;
     10   unsigned long long ull_max = 18446744073709551615ULL;
     11   if ((unsigned long long)ll_max != ull_hi - 1ULL) return 80;
     12   if ((unsigned long long)ll_min != ull_hi) return 81;
     13 
     14   _Bool ov = __builtin_sadd_overflow(40, 2, &r);
     15   if (ov || r != 42) return 1;
     16   ov = __builtin_sadd_overflow(2147483647, 1, &r);
     17   if (!ov || r != -2147483647 - 1) return 2;
     18   ov = __builtin_ssub_overflow(-2147483647 - 1, 1, &r);
     19   if (!ov || r != 2147483647) return 3;
     20   ov = __builtin_smul_overflow(1073741824, 2, &r);
     21   if (!ov || r != -2147483647 - 1) return 4;
     22 
     23   ov = __builtin_uadd_overflow(40u, 2u, &ur);
     24   if (ov || ur != 42u) return 5;
     25   ov = __builtin_uadd_overflow(4294967295u, 1u, &ur);
     26   if (!ov || ur != 0u) return 6;
     27   ov = __builtin_usub_overflow(0u, 1u, &ur);
     28   if (!ov || ur != 4294967295u) return 7;
     29   ov = __builtin_umul_overflow(2147483648u, 2u, &ur);
     30   if (!ov || ur != 0u) return 8;
     31 
     32   /* The *l_overflow assertions hard-code 64-bit `long` boundary constants, so
     33    * they only hold under LP64. On an ILP32 target (`long` is 32-bit) those
     34    * literals truncate and `long` is just a width-duplicate of the `int`
     35    * builtins above; rv32's 32-bit overflow path is covered by the `int`
     36    * variants and its 64-bit path by the `long long` variants below, so gate
     37    * the `long`-width block out where `long` is not 64-bit. */
     38 #if __SIZEOF_LONG__ == 8
     39   long lr = 0;
     40   unsigned long ulr = 0;
     41   long l_hi = 4611686018427387904L;
     42   unsigned long ul_hi = 9223372036854775808UL;
     43   long l_max = 9223372036854775807L;
     44   long l_min = (long)9223372036854775808UL;
     45   unsigned long ul_max = 18446744073709551615UL;
     46   if ((unsigned long)l_max != ul_hi - 1UL) return 78;
     47   if ((unsigned long)l_min != ul_hi) return 79;
     48 
     49   ov = __builtin_saddl_overflow(40L, 2L, &lr);
     50   if (ov || lr != 42L) return 15;
     51   ov = __builtin_saddl_overflow(l_max, 1L, &lr);
     52   if (!ov) return 16;
     53   if (lr != l_min) return 160;
     54   ov = __builtin_ssubl_overflow(l_min, 1L, &lr);
     55   if (!ov || lr != l_max) return 17;
     56   ov = __builtin_smull_overflow(l_hi, 2L, &lr);
     57   if (!ov || lr != l_min) return 18;
     58 
     59   ov = __builtin_uaddl_overflow(40UL, 2UL, &ulr);
     60   if (ov || ulr != 42UL) return 19;
     61   ov = __builtin_uaddl_overflow(ul_max, 1UL, &ulr);
     62   if (!ov || ulr != 0UL) return 20;
     63   ov = __builtin_usubl_overflow(0UL, 1UL, &ulr);
     64   if (!ov || ulr != ul_max) return 21;
     65   ov = __builtin_umull_overflow(ul_hi, 2UL, &ulr);
     66   if (!ov || ulr != 0UL) return 22;
     67 #endif
     68 
     69   ov = __builtin_saddll_overflow(ll_max, 1LL, &llr);
     70   if (!ov) return 9;
     71   if (llr != ll_min) return 90;
     72   ov = __builtin_ssubll_overflow(ll_min, 1LL, &llr);
     73   if (!ov || llr != ll_max) return 10;
     74   ov = __builtin_smulll_overflow(ll_hi, 2LL, &llr);
     75   if (!ov) return 11;
     76   if (llr != ll_min) return 110;
     77   ov = __builtin_uaddll_overflow(ull_max, 1ULL, &ullr);
     78   if (!ov || ullr != 0ULL) return 12;
     79   ov = __builtin_usubll_overflow(0ULL, 1ULL, &ullr);
     80   if (!ov || ullr != ull_max) return 13;
     81   ov = __builtin_umulll_overflow(ull_hi, 2ULL, &ullr);
     82   if (!ov || ullr != 0ULL) return 14;
     83   ov = __builtin_uaddll_overflow(9223372036854775808ULL, 9223372036854775808ULL,
     84                                  &ullr);
     85   if (!ov || ullr != 0ULL) return 23;
     86   return 42;
     87 }