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 }