1*d32c0d14SRoman Lebedev // RUN: %clang -fsanitize=implicit-unsigned-integer-truncation %s -o %t && %run %t 2>&1 | FileCheck %s --check-prefixes=CHECK 2*d32c0d14SRoman Lebedev 3*d32c0d14SRoman Lebedev #include <stdint.h> 4*d32c0d14SRoman Lebedev main()5*d32c0d14SRoman Lebedevint main() { 6*d32c0d14SRoman Lebedev // CHECK-NOT: implicit-conversion 7*d32c0d14SRoman Lebedev 8*d32c0d14SRoman Lebedev // Negative tests. Even if they produce unexpected results, this sanitizer does not care. 9*d32c0d14SRoman Lebedev int8_t n0 = (~((uint32_t)(0))); // ~0 -> -1, but do not warn. 10*d32c0d14SRoman Lebedev uint8_t n2 = 128; 11*d32c0d14SRoman Lebedev uint8_t n3 = 255; 12*d32c0d14SRoman Lebedev // Bools do not count 13*d32c0d14SRoman Lebedev _Bool b0 = (~((uint32_t)(0))); 14*d32c0d14SRoman Lebedev _Bool b1 = 255; 15*d32c0d14SRoman Lebedev 16*d32c0d14SRoman Lebedev // Explicit and-ing of bits will silence it. 17*d32c0d14SRoman Lebedev uint8_t nc0 = ((~((uint32_t)(0))) & 255); 18*d32c0d14SRoman Lebedev 19*d32c0d14SRoman Lebedev // Positive tests. 20*d32c0d14SRoman Lebedev uint8_t t0 = (~((uint32_t)(0))); 21*d32c0d14SRoman Lebedev // CHECK: implicit-conversion 22*d32c0d14SRoman Lebedev // CHECK-NOT: implicit-conversion 23*d32c0d14SRoman Lebedev 24*d32c0d14SRoman Lebedev return 0; 25*d32c0d14SRoman Lebedev } 26