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