12d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %clangxx -DADD_I32 -fsanitize=signed-integer-overflow %s -o %t && %run %t 2>&1 | FileCheck %s --check-prefix=CHECK-ADD_I32
22d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %clangxx -DADD_I64 -fsanitize=signed-integer-overflow %s -o %t && %run %t 2>&1 | FileCheck %s --check-prefix=CHECK-ADD_I64
32d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %clangxx -DADD_I128 -fsanitize=signed-integer-overflow %s -o %t && %run %t 2>&1 | FileCheck %s --check-prefix=CHECK-ADD_I128
46ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith
56ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith#include <stdint.h>
60a7062f2cbb01b348bbc09be21a577957a2c68c2Richard Smith#include <stdio.h>
76ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith
86ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smithint main() {
96ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith  // These promote to 'int'.
106ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith  (void)(int8_t(0x7f) + int8_t(0x7f));
116ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith  (void)(int16_t(0x3fff) + int16_t(0x4000));
126ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith
136ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith#ifdef ADD_I32
146ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith  int32_t k = 0x12345678;
156ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith  k += 0x789abcde;
1601247b76902f2329f6edf4b9b8e95fc1be06c400Will Dietz  // CHECK-ADD_I32: add-overflow.cpp:[[@LINE-1]]:5: runtime error: signed integer overflow: 305419896 + 2023406814 cannot be represented in type 'int'
176ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith#endif
186ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith
196ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith#ifdef ADD_I64
206ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith  (void)(int64_t(8000000000000000000ll) + int64_t(2000000000000000000ll));
215b16dba10c171bc74a3d55a61b4406377aecbab8Alexey Samsonov  // CHECK-ADD_I64: 8000000000000000000 + 2000000000000000000 cannot be represented in type '{{long( long)?}}'
226ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith#endif
236ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith
246ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith#ifdef ADD_I128
250a7062f2cbb01b348bbc09be21a577957a2c68c2Richard Smith# ifdef __SIZEOF_INT128__
266ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith  (void)((__int128_t(1) << 126) + (__int128_t(1) << 126));
270a7062f2cbb01b348bbc09be21a577957a2c68c2Richard Smith# else
280a7062f2cbb01b348bbc09be21a577957a2c68c2Richard Smith  puts("__int128 not supported");
290a7062f2cbb01b348bbc09be21a577957a2c68c2Richard Smith# endif
300a7062f2cbb01b348bbc09be21a577957a2c68c2Richard Smith  // CHECK-ADD_I128: {{0x40000000000000000000000000000000 \+ 0x40000000000000000000000000000000 cannot be represented in type '__int128'|__int128 not supported}}
316ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith#endif
326ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith}
33