summaryrefslogtreecommitdiff
path: root/test/ubsan_minimal/TestCases/implicit-integer-truncation.c
diff options
context:
space:
mode:
Diffstat (limited to 'test/ubsan_minimal/TestCases/implicit-integer-truncation.c')
-rw-r--r--test/ubsan_minimal/TestCases/implicit-integer-truncation.c24
1 files changed, 24 insertions, 0 deletions
diff --git a/test/ubsan_minimal/TestCases/implicit-integer-truncation.c b/test/ubsan_minimal/TestCases/implicit-integer-truncation.c
new file mode 100644
index 000000000000..1db6e6976815
--- /dev/null
+++ b/test/ubsan_minimal/TestCases/implicit-integer-truncation.c
@@ -0,0 +1,24 @@
+// RUN: %clang -fsanitize=implicit-integer-truncation %s -o %t && %run %t 2>&1 | FileCheck %s --check-prefixes=CHECK
+
+#include <stdint.h>
+
+int main() {
+// CHECK-NOT: integer-truncation.c
+
+ // Negative tests. Even if they produce unexpected results, this sanitizer does not care.
+ int8_t n0 = (~((uint32_t)(0))); // ~0 -> -1, but do not warn.
+ uint8_t n2 = 128;
+ uint8_t n3 = 255;
+ // Bools do not count
+ _Bool b0 = (~((uint32_t)(0)));
+ _Bool b1 = 255;
+
+ // Explicit and-ing of bits will silence it.
+ uint8_t nc0 = ((~((uint32_t)(0))) & 255);
+
+ // Positive tests.
+ uint8_t t0 = (~((uint32_t)(0)));
+// CHECK: implicit-conversion
+
+ return 0;
+}