[compiler-rt] r343250 - [compiler-rt][ubsan][NFC] Slight test cleanup in preparation for D50902.

Roman Lebedev via llvm-commits llvm-commits at lists.llvm.org
Thu Sep 27 12:07:47 PDT 2018


Author: lebedevri
Date: Thu Sep 27 12:07:47 2018
New Revision: 343250

URL: http://llvm.org/viewvc/llvm-project?rev=343250&view=rev
Log:
[compiler-rt][ubsan][NFC] Slight test cleanup in preparation for D50902.

Reviewers: vsk, vitalybuka, filcab

Reviewed By: vitalybuka

Subscribers: kubamracek, dberris, llvm-commits, #sanitizers

Differential Revision: https://reviews.llvm.org/D52590

Modified:
    compiler-rt/trunk/test/ubsan/TestCases/ImplicitConversion/integer-conversion.c
    compiler-rt/trunk/test/ubsan/TestCases/ImplicitConversion/integer-truncation.c

Modified: compiler-rt/trunk/test/ubsan/TestCases/ImplicitConversion/integer-conversion.c
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/ubsan/TestCases/ImplicitConversion/integer-conversion.c?rev=343250&r1=343249&r2=343250&view=diff
==============================================================================
--- compiler-rt/trunk/test/ubsan/TestCases/ImplicitConversion/integer-conversion.c (original)
+++ compiler-rt/trunk/test/ubsan/TestCases/ImplicitConversion/integer-conversion.c Thu Sep 27 12:07:47 2018
@@ -1,70 +1,324 @@
-// RUN: %clang   -x c   -fsanitize=implicit-integer-truncation %s -DV0 -o %t && %run %t 2>&1 | not FileCheck %s --implicit-check-not="implicit conversion" --check-prefixes=CHECK-V0
-// RUN: %clang   -x c   -fsanitize=implicit-integer-truncation %s -DV1 -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not="implicit conversion" --check-prefixes=CHECK-V1
-// RUN: %clang   -x c   -fsanitize=implicit-integer-truncation %s -DV2 -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not="implicit conversion" --check-prefixes=CHECK-V2
-// RUN: %clang   -x c   -fsanitize=implicit-integer-truncation %s -DV3 -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not="implicit conversion" --check-prefixes=CHECK-V3
-// RUN: %clang   -x c   -fsanitize=implicit-integer-truncation %s -DV4 -o %t && %run %t 2>&1 | not FileCheck %s --implicit-check-not="implicit conversion" --check-prefixes=CHECK-V4
-// RUN: %clang   -x c   -fsanitize=implicit-integer-truncation %s -DV5 -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not="implicit conversion" --check-prefixes=CHECK-V5
-// RUN: %clang   -x c   -fsanitize=implicit-integer-truncation %s -DV6 -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not="implicit conversion" --check-prefixes=CHECK-V6
-
-// RUN: %clang   -x c++ -fsanitize=implicit-integer-truncation %s -DV0 -o %t && %run %t 2>&1 | not FileCheck %s --implicit-check-not="implicit conversion" --check-prefixes=CHECK-V0
-// RUN: %clang   -x c++ -fsanitize=implicit-integer-truncation %s -DV1 -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not="implicit conversion" --check-prefixes=CHECK-V1
-// RUN: %clang   -x c++ -fsanitize=implicit-integer-truncation %s -DV2 -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not="implicit conversion" --check-prefixes=CHECK-V2
-// RUN: %clang   -x c++ -fsanitize=implicit-integer-truncation %s -DV3 -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not="implicit conversion" --check-prefixes=CHECK-V3
-// RUN: %clang   -x c++ -fsanitize=implicit-integer-truncation %s -DV4 -o %t && %run %t 2>&1 | not FileCheck %s --implicit-check-not="implicit conversion" --check-prefixes=CHECK-V4
-// RUN: %clang   -x c++ -fsanitize=implicit-integer-truncation %s -DV5 -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not="implicit conversion" --check-prefixes=CHECK-V5
-// RUN: %clang   -x c++ -fsanitize=implicit-integer-truncation %s -DV6 -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not="implicit conversion" --check-prefixes=CHECK-V6
+// RUN: %clang   -x c   -fsanitize=implicit-conversion %s -DV0 -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not="implicit conversion" --check-prefixes=CHECK-V0
+// RUN: %clang   -x c   -fsanitize=implicit-conversion %s -DV1 -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not="implicit conversion" --check-prefixes=CHECK-V1
+// RUN: %clang   -x c   -fsanitize=implicit-conversion %s -DV2 -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not="implicit conversion" --check-prefixes=CHECK-V2
+// RUN: %clang   -x c   -fsanitize=implicit-conversion %s -DV3 -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not="implicit conversion" --check-prefixes=CHECK-V3
+// RUN: %clang   -x c   -fsanitize=implicit-conversion %s -DV4 -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not="implicit conversion" --check-prefixes=CHECK-V4
+// RUN: %clang   -x c   -fsanitize=implicit-conversion %s -DV5 -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not="implicit conversion" --check-prefixes=CHECK-V5
+// RUN: %clang   -x c   -fsanitize=implicit-conversion %s -DV6 -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not="implicit conversion" --check-prefixes=CHECK-V6
+// RUN: %clang   -x c   -fsanitize=implicit-conversion %s -DV7 -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not="implicit conversion" --check-prefixes=CHECK-V7
+
+// RUN: %clang   -x c++ -fsanitize=implicit-conversion %s -DV0 -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not="implicit conversion" --check-prefixes=CHECK-V0
+// RUN: %clang   -x c++ -fsanitize=implicit-conversion %s -DV1 -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not="implicit conversion" --check-prefixes=CHECK-V1
+// RUN: %clang   -x c++ -fsanitize=implicit-conversion %s -DV2 -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not="implicit conversion" --check-prefixes=CHECK-V2
+// RUN: %clang   -x c++ -fsanitize=implicit-conversion %s -DV3 -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not="implicit conversion" --check-prefixes=CHECK-V3
+// RUN: %clang   -x c++ -fsanitize=implicit-conversion %s -DV4 -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not="implicit conversion" --check-prefixes=CHECK-V4
+// RUN: %clang   -x c++ -fsanitize=implicit-conversion %s -DV5 -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not="implicit conversion" --check-prefixes=CHECK-V5
+// RUN: %clang   -x c++ -fsanitize=implicit-conversion %s -DV6 -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not="implicit conversion" --check-prefixes=CHECK-V6
+// RUN: %clang   -x c++ -fsanitize=implicit-conversion %s -DV7 -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not="implicit conversion" --check-prefixes=CHECK-V7
 
 #include <stdint.h>
 
-int8_t positive6_convert_unsigned_int_to_signed_char(uint32_t x) {
+// Test plan:
+//  * Two types - int and char
+//  * Two signs - signed and unsigned
+//  * Square that - we have input and output types.
+// Thus, there are total of (2*2)^2 == 16 tests.
+// These are all the possible variations/combinations of casts.
+// However, not all of them should result in the check.
+// So here, we *only* check which should and which should not result in checks.
+
+unsigned int convert_unsigned_int_to_unsigned_int(unsigned int x) {
 #line 100
   return x;
 }
 
-#line 1120 // !!!
+unsigned char convert_unsigned_char_to_unsigned_char(unsigned char x) {
+#line 200
+  return x;
+}
+
+signed int convert_signed_int_to_signed_int(signed int x) {
+#line 300
+  return x;
+}
+
+signed char convert_signed_char_to_signed_char(signed char x) {
+#line 400
+  return x;
+}
+
+unsigned char convert_unsigned_int_to_unsigned_char(unsigned int x) {
+#line 500
+  return x;
+}
+
+unsigned int convert_unsigned_char_to_unsigned_int(unsigned char x) {
+#line 600
+  return x;
+}
+
+signed int convert_unsigned_char_to_signed_int(unsigned char x) {
+#line 700
+  return x;
+}
+
+signed int convert_signed_char_to_signed_int(signed char x) {
+#line 800
+  return x;
+}
+
+signed int convert_unsigned_int_to_signed_int(unsigned int x) {
+#line 900
+  return x;
+}
+
+unsigned int convert_signed_int_to_unsigned_int(signed int x) {
+#line 1000
+  return x;
+}
+
+unsigned char convert_signed_int_to_unsigned_char(signed int x) {
+#line 1100
+  return x;
+}
+
+unsigned char convert_signed_char_to_unsigned_char(signed char x) {
+#line 1200
+  return x;
+}
+
+signed char convert_unsigned_char_to_signed_char(unsigned char x) {
+#line 1300
+  return x;
+}
+
+unsigned int convert_signed_char_to_unsigned_int(signed char x) {
+#line 1400
+  return x;
+}
+
+signed char convert_unsigned_int_to_signed_char(unsigned int x) {
+#line 1500
+  return x;
+}
+
+signed char convert_signed_int_to_signed_char(signed int x) {
+#line 1600
+  return x;
+}
 
-void test_positives() {
+#line 1111 // !!!
+
+int main() {
   // No bits set.
-  positive6_convert_unsigned_int_to_signed_char(0);
+  convert_unsigned_int_to_unsigned_int(0);
+  convert_unsigned_char_to_unsigned_char(0);
+  convert_signed_int_to_signed_int(0);
+  convert_signed_char_to_signed_char(0);
+  convert_unsigned_int_to_unsigned_char(0);
+  convert_unsigned_char_to_unsigned_int(0);
+  convert_unsigned_char_to_signed_int(0);
+  convert_signed_char_to_signed_int(0);
+  convert_unsigned_int_to_signed_int(0);
+  convert_signed_int_to_unsigned_int(0);
+  convert_signed_int_to_unsigned_char(0);
+  convert_signed_char_to_unsigned_char(0);
+  convert_unsigned_char_to_signed_char(0);
+  convert_signed_char_to_unsigned_int(0);
+  convert_unsigned_int_to_signed_char(0);
+  convert_signed_int_to_signed_char(0);
 
   // One lowest bit set.
-  positive6_convert_unsigned_int_to_signed_char(1);
+  convert_unsigned_int_to_unsigned_int(1);
+  convert_unsigned_char_to_unsigned_char(1);
+  convert_signed_int_to_signed_int(1);
+  convert_signed_char_to_signed_char(1);
+  convert_unsigned_int_to_unsigned_char(1);
+  convert_unsigned_char_to_unsigned_int(1);
+  convert_unsigned_char_to_signed_int(1);
+  convert_signed_char_to_signed_int(1);
+  convert_unsigned_int_to_signed_int(1);
+  convert_signed_int_to_unsigned_int(1);
+  convert_signed_int_to_unsigned_char(1);
+  convert_signed_char_to_unsigned_char(1);
+  convert_unsigned_char_to_signed_char(1);
+  convert_signed_char_to_unsigned_int(1);
+  convert_unsigned_int_to_signed_char(1);
+  convert_signed_int_to_signed_char(1);
 
 #if defined(V0)
   // All source bits set.
-  positive6_convert_unsigned_int_to_signed_char((uint32_t)UINT32_MAX);
+  convert_unsigned_int_to_unsigned_int((uint32_t)UINT32_MAX);
+  convert_unsigned_char_to_unsigned_char((uint8_t)UINT8_MAX);
+  convert_signed_int_to_signed_int((int32_t)(uint32_t)UINT32_MAX);
+  convert_signed_char_to_signed_char((int8_t)UINT8_MAX);
+  convert_unsigned_int_to_unsigned_char((uint32_t)UINT32_MAX);
+// CHECK-V0: {{.*}}integer-conversion.c:500:10: runtime error: implicit conversion from type 'unsigned int' of value 4294967295 (32-bit, unsigned) to type 'unsigned char' changed the value to 255 (8-bit, unsigned
+  convert_unsigned_char_to_unsigned_int((uint8_t)UINT8_MAX);
+  convert_unsigned_char_to_signed_int((uint8_t)UINT8_MAX);
+  convert_signed_char_to_signed_int((int8_t)UINT8_MAX);
+  convert_unsigned_int_to_signed_int((uint32_t)UINT32_MAX);
+  convert_signed_int_to_unsigned_int((int32_t)(uint32_t)UINT32_MAX);
+  convert_signed_int_to_unsigned_char((int32_t)(uint32_t)UINT32_MAX);
+// CHECK-V0: {{.*}}integer-conversion.c:1100:10: runtime error: implicit conversion from type 'int' of value -1 (32-bit, signed) to type 'unsigned char' changed the value to 255 (8-bit, unsigned)
+  convert_signed_char_to_unsigned_char((int8_t)UINT8_MAX);
+  convert_unsigned_char_to_signed_char((uint8_t)UINT8_MAX);
+  convert_signed_char_to_unsigned_int((int8_t)UINT8_MAX);
+  convert_unsigned_int_to_signed_char((uint32_t)UINT32_MAX);
+  convert_signed_int_to_signed_char((int32_t)(uint32_t)UINT32_MAX);
 #elif defined(V1)
-  // Source 'Sign' bit set.
-  positive6_convert_unsigned_int_to_signed_char((uint32_t)INT32_MIN);
-// CHECK-V1: {{.*}}integer-conversion.c:100:10: runtime error: implicit conversion from type 'uint32_t' (aka 'unsigned int') of value 2147483648 (32-bit, unsigned) to type 'int8_t' (aka 'signed char') changed the value to 0 (8-bit, signed)
+   // Source 'Sign' bit set.
+  convert_unsigned_int_to_unsigned_int((uint32_t)INT32_MIN);
+  convert_unsigned_char_to_unsigned_char((uint8_t)INT8_MIN);
+  convert_signed_int_to_signed_int((int32_t)(uint32_t)INT32_MIN);
+  convert_signed_char_to_signed_char((int8_t)INT8_MIN);
+  convert_unsigned_int_to_unsigned_char((uint32_t)INT32_MIN);
+// CHECK-V1: {{.*}}integer-conversion.c:500:10: runtime error: implicit conversion from type 'unsigned int' of value 2147483648 (32-bit, unsigned) to type 'unsigned char' changed the value to 0 (8-bit, unsigned)
+  convert_unsigned_char_to_unsigned_int((uint8_t)INT8_MIN);
+  convert_unsigned_char_to_signed_int((uint8_t)INT8_MIN);
+  convert_signed_char_to_signed_int((int8_t)INT8_MIN);
+  convert_unsigned_int_to_signed_int((uint32_t)INT32_MIN);
+  convert_signed_int_to_unsigned_int((int32_t)(uint32_t)INT32_MIN);
+  convert_signed_int_to_unsigned_char((int32_t)(uint32_t)INT32_MIN);
+// CHECK-V1: {{.*}}integer-conversion.c:1100:10: runtime error: implicit conversion from type 'int' of value -2147483648 (32-bit, signed) to type 'unsigned char' changed the value to 0 (8-bit, unsigned)
+  convert_signed_char_to_unsigned_char((int8_t)INT8_MIN);
+  convert_unsigned_char_to_signed_char((uint8_t)INT8_MIN);
+  convert_signed_char_to_unsigned_int((int8_t)INT8_MIN);
+  convert_unsigned_int_to_signed_char((uint32_t)INT32_MIN);
+// CHECK-V1: {{.*}}integer-conversion.c:1500:10: runtime error: implicit conversion from type 'unsigned int' of value 2147483648 (32-bit, unsigned) to type 'signed char' changed the value to 0 (8-bit, signed)
+  convert_signed_int_to_signed_char((int32_t)(uint32_t)INT32_MIN);
+// CHECK-V1: {{.*}}integer-conversion.c:1600:10: runtime error: implicit conversion from type 'int' of value -2147483648 (32-bit, signed) to type 'signed char' changed the value to 0 (8-bit, signed)
 #elif defined(V2)
   // All bits except the source 'Sign' bit are set.
-  positive6_convert_unsigned_int_to_signed_char((uint32_t)INT32_MAX);
-// CHECK-V2: {{.*}}integer-conversion.c:100:10: runtime error: implicit conversion from type 'uint32_t' (aka 'unsigned int') of value 2147483647 (32-bit, unsigned) to type 'int8_t' (aka 'signed char') changed the value to -1 (8-bit, signed)
+  convert_unsigned_int_to_unsigned_int((uint32_t)INT32_MAX);
+  convert_unsigned_char_to_unsigned_char((uint8_t)INT8_MAX);
+  convert_signed_int_to_signed_int((int32_t)(uint32_t)INT32_MAX);
+  convert_signed_char_to_signed_char((int8_t)INT8_MAX);
+  convert_unsigned_int_to_unsigned_char((uint32_t)INT32_MAX);
+// CHECK-V2: {{.*}}integer-conversion.c:500:10: runtime error: implicit conversion from type 'unsigned int' of value 2147483647 (32-bit, unsigned) to type 'unsigned char' changed the value to 255 (8-bit, unsigned)
+  convert_unsigned_char_to_unsigned_int((uint8_t)INT8_MAX);
+  convert_unsigned_char_to_signed_int((uint8_t)INT8_MAX);
+  convert_signed_char_to_signed_int((int8_t)INT8_MAX);
+  convert_unsigned_int_to_signed_int((uint32_t)INT32_MAX);
+  convert_signed_int_to_unsigned_int((int32_t)(uint32_t)INT32_MAX);
+  convert_signed_int_to_unsigned_char((int32_t)(uint32_t)INT32_MAX);
+// CHECK-V2: {{.*}}integer-conversion.c:1100:10: runtime error: implicit conversion from type 'int' of value 2147483647 (32-bit, signed) to type 'unsigned char' changed the value to 255 (8-bit, unsigned)
+  convert_signed_char_to_unsigned_char((int8_t)INT8_MAX);
+  convert_unsigned_char_to_signed_char((uint8_t)INT8_MAX);
+  convert_signed_char_to_unsigned_int((int8_t)INT8_MAX);
+  convert_unsigned_int_to_signed_char((uint32_t)INT32_MAX);
+// CHECK-V2: {{.*}}integer-conversion.c:1500:10: runtime error: implicit conversion from type 'unsigned int' of value 2147483647 (32-bit, unsigned) to type 'signed char' changed the value to -1 (8-bit, signed)
+  convert_signed_int_to_signed_char((int32_t)(uint32_t)INT32_MAX);
+// CHECK-V2: {{.*}}integer-conversion.c:1600:10: runtime error: implicit conversion from type 'int' of value 2147483647 (32-bit, signed) to type 'signed char' changed the value to -1 (8-bit, signed)
 #elif defined(V3)
   // All destination bits set.
-  positive6_convert_unsigned_int_to_signed_char((uint32_t)UINT8_MAX);
-// CHECK-V3: {{.*}}integer-conversion.c:100:10: runtime error: implicit conversion from type 'uint32_t' (aka 'unsigned int') of value 255 (32-bit, unsigned) to type 'int8_t' (aka 'signed char') changed the value to -1 (8-bit, signed)
+  convert_unsigned_int_to_unsigned_int((uint32_t)UINT8_MAX);
+  convert_unsigned_char_to_unsigned_char((uint8_t)UINT8_MAX);
+  convert_signed_int_to_signed_int((int32_t)(uint32_t)UINT8_MAX);
+  convert_signed_char_to_signed_char((int8_t)UINT8_MAX);
+  convert_unsigned_int_to_unsigned_char((uint32_t)UINT8_MAX);
+  convert_unsigned_char_to_unsigned_int((uint8_t)UINT8_MAX);
+  convert_unsigned_char_to_signed_int((uint8_t)UINT8_MAX);
+  convert_signed_char_to_signed_int((int8_t)UINT8_MAX);
+  convert_unsigned_int_to_signed_int((uint32_t)UINT8_MAX);
+  convert_signed_int_to_unsigned_int((int32_t)(uint32_t)UINT8_MAX);
+  convert_signed_int_to_unsigned_char((int32_t)(uint32_t)UINT8_MAX);
+  convert_signed_char_to_unsigned_char((int8_t)UINT8_MAX);
+  convert_unsigned_char_to_signed_char((uint8_t)UINT8_MAX);
+  convert_signed_char_to_unsigned_int((int8_t)UINT8_MAX);
+  convert_unsigned_int_to_signed_char((uint32_t)UINT8_MAX);
+// CHECK-V3: {{.*}}integer-conversion.c:1500:10: runtime error: implicit conversion from type 'unsigned int' of value 255 (32-bit, unsigned) to type 'signed char' changed the value to -1 (8-bit, signed)
+  convert_signed_int_to_signed_char((int32_t)(uint32_t)UINT8_MAX);
+// CHECK-V3: {{.*}}integer-conversion.c:1600:10: runtime error: implicit conversion from type 'int' of value 255 (32-bit, signed) to type 'signed char' changed the value to -1 (8-bit, signed)
 #elif defined(V4)
   // Destination 'sign' bit set.
-  positive6_convert_unsigned_int_to_signed_char((uint32_t)INT8_MIN);
+  convert_unsigned_int_to_unsigned_int((uint32_t)(uint8_t)INT8_MIN);
+  convert_unsigned_char_to_unsigned_char((uint8_t)(uint8_t)INT8_MIN);
+  convert_signed_int_to_signed_int((int32_t)(uint32_t)(uint8_t)INT8_MIN);
+  convert_signed_char_to_signed_char((int8_t)(uint8_t)INT8_MIN);
+  convert_unsigned_int_to_unsigned_char((uint32_t)(uint8_t)INT8_MIN);
+  convert_unsigned_char_to_unsigned_int((uint8_t)(uint8_t)INT8_MIN);
+  convert_unsigned_char_to_signed_int((uint8_t)(uint8_t)INT8_MIN);
+  convert_signed_char_to_signed_int((int8_t)(uint8_t)INT8_MIN);
+  convert_unsigned_int_to_signed_int((uint32_t)(uint8_t)INT8_MIN);
+  convert_signed_int_to_unsigned_int((int32_t)(uint32_t)(uint8_t)INT8_MIN);
+  convert_signed_int_to_unsigned_char((int32_t)(uint32_t)(uint8_t)INT8_MIN);
+  convert_signed_char_to_unsigned_char((int8_t)(uint8_t)INT8_MIN);
+  convert_unsigned_char_to_signed_char((uint8_t)(uint8_t)INT8_MIN);
+  convert_signed_char_to_unsigned_int((int8_t)(uint8_t)INT8_MIN);
+  convert_unsigned_int_to_signed_char((uint32_t)(uint8_t)INT8_MIN);
+// CHECK-V4: {{.*}}integer-conversion.c:1500:10: runtime error: implicit conversion from type 'unsigned int' of value 128 (32-bit, unsigned) to type 'signed char' changed the value to -128 (8-bit, signed)
+  convert_signed_int_to_signed_char((int32_t)(uint32_t)(uint8_t)INT8_MIN);
+// CHECK-V4: {{.*}}integer-conversion.c:1600:10: runtime error: implicit conversion from type 'int' of value 128 (32-bit, signed) to type 'signed char' changed the value to -128 (8-bit, signed)
 #elif defined(V5)
   // All bits except the destination 'sign' bit are set.
-  positive6_convert_unsigned_int_to_signed_char(~((uint32_t)(uint8_t)INT8_MIN));
-// CHECK-V5: {{.*}}integer-conversion.c:100:10: runtime error: implicit conversion from type 'uint32_t' (aka 'unsigned int') of value 4294967167 (32-bit, unsigned) to type 'int8_t' (aka 'signed char') changed the value to 127 (8-bit, signed)
+  convert_unsigned_int_to_unsigned_int((~((uint32_t)(uint8_t)INT8_MIN)));
+  convert_unsigned_char_to_unsigned_char((uint8_t)(uint8_t)INT8_MIN);
+  convert_signed_int_to_signed_int((int32_t)(~((uint32_t)(uint8_t)INT8_MIN)));
+  convert_signed_char_to_signed_char((int8_t)(uint8_t)INT8_MIN);
+  convert_unsigned_int_to_unsigned_char((~((uint32_t)(uint8_t)INT8_MIN)));
+// CHECK-V5: {{.*}}integer-conversion.c:500:10: runtime error: implicit conversion from type 'unsigned int' of value 4294967167 (32-bit, unsigned) to type 'unsigned char' changed the value to 127 (8-bit, unsigned)
+  convert_unsigned_char_to_unsigned_int((uint8_t)(uint8_t)INT8_MIN);
+  convert_unsigned_char_to_signed_int((uint8_t)(uint8_t)INT8_MIN);
+  convert_signed_char_to_signed_int((int8_t)(uint8_t)INT8_MIN);
+  convert_unsigned_int_to_signed_int((~((uint32_t)(uint8_t)INT8_MIN)));
+  convert_signed_int_to_unsigned_int((int32_t)(~((uint32_t)(uint8_t)INT8_MIN)));
+  convert_signed_int_to_unsigned_char((int32_t)(~((uint32_t)(uint8_t)INT8_MIN)));
+// CHECK-V5: {{.*}}integer-conversion.c:1100:10: runtime error: implicit conversion from type 'int' of value -129 (32-bit, signed) to type 'unsigned char' changed the value to 127 (8-bit, unsigned)
+  convert_signed_char_to_unsigned_char((int8_t)(uint8_t)INT8_MIN);
+  convert_unsigned_char_to_signed_char((uint8_t)(uint8_t)INT8_MIN);
+  convert_signed_char_to_unsigned_int((int8_t)(uint8_t)INT8_MIN);
+  convert_unsigned_int_to_signed_char((~((uint32_t)(uint8_t)INT8_MIN)));
+// CHECK-V5: {{.*}}integer-conversion.c:1500:10: runtime error: implicit conversion from type 'unsigned int' of value 4294967167 (32-bit, unsigned) to type 'signed char' changed the value to 127 (8-bit, signed)
+  convert_signed_int_to_signed_char((int32_t)(~((uint32_t)(uint8_t)INT8_MIN)));
+// CHECK-V5: {{.*}}integer-conversion.c:1600:10: runtime error: implicit conversion from type 'int' of value -129 (32-bit, signed) to type 'signed char' changed the value to 127 (8-bit, signed)
 #elif defined(V6)
   // Only the source and destination sign bits are set.
-  positive6_convert_unsigned_int_to_signed_char((uint32_t)((uint32_t)INT32_MIN | (uint32_t)((uint8_t)INT8_MIN)));
-// CHECK-V6: {{.*}}integer-conversion.c:100:10: runtime error: implicit conversion from type 'uint32_t' (aka 'unsigned int') of value 2147483776 (32-bit, unsigned) to type 'int8_t' (aka 'signed char') changed the value to -128 (8-bit, signed)
+  convert_unsigned_int_to_unsigned_int((uint32_t)INT32_MIN);
+  convert_unsigned_char_to_unsigned_char((uint8_t)INT8_MIN);
+  convert_signed_int_to_signed_int((int32_t)INT32_MIN);
+  convert_signed_char_to_signed_char((int8_t)INT8_MIN);
+  convert_unsigned_int_to_unsigned_char(((uint32_t)INT32_MIN) | ((uint32_t)(uint8_t)INT8_MIN));
+// CHECK-V6: {{.*}}integer-conversion.c:500:10: runtime error: implicit conversion from type 'unsigned int' of value 2147483776 (32-bit, unsigned) to type 'unsigned char' changed the value to 128 (8-bit, unsigned)
+  convert_unsigned_char_to_unsigned_int((uint8_t)INT8_MIN);
+  convert_unsigned_char_to_signed_int((uint8_t)INT8_MIN);
+  convert_signed_char_to_signed_int((int8_t)INT8_MIN);
+  convert_unsigned_int_to_signed_int((uint32_t)INT32_MIN);
+  convert_signed_int_to_unsigned_int((uint32_t)INT32_MIN);
+  convert_signed_int_to_unsigned_char((int32_t)(((uint32_t)INT32_MIN) | ((uint32_t)(uint8_t)INT8_MIN)));
+// CHECK-V6: {{.*}}integer-conversion.c:1100:10: runtime error: implicit conversion from type 'int' of value -2147483520 (32-bit, signed) to type 'unsigned char' changed the value to 128 (8-bit, unsigned)
+  convert_signed_char_to_unsigned_char((int8_t)INT8_MIN);
+  convert_unsigned_char_to_signed_char((uint8_t)INT8_MIN);
+  convert_signed_char_to_unsigned_int((int8_t)INT8_MIN);
+  convert_unsigned_int_to_signed_char((((uint32_t)INT32_MIN) | ((uint32_t)(uint8_t)INT8_MIN)));
+// CHECK-V6: {{.*}}integer-conversion.c:1500:10: runtime error: implicit conversion from type 'unsigned int' of value 2147483776 (32-bit, unsigned) to type 'signed char' changed the value to -128 (8-bit, signed)
+  convert_signed_int_to_signed_char((int32_t)(((uint32_t)INT32_MIN) | ((uint32_t)(uint8_t)INT8_MIN)));
+// CHECK-V6: {{.*}}integer-conversion.c:1600:10: runtime error: implicit conversion from type 'int' of value -2147483520 (32-bit, signed) to type 'signed char' changed the value to -128 (8-bit, signed)
+#elif defined(V7)
+  // All bits except the source and destination sign bits are set.
+  convert_unsigned_int_to_unsigned_int((uint32_t)INT32_MAX);
+  convert_unsigned_char_to_unsigned_char((uint8_t)INT8_MAX);
+  convert_signed_int_to_signed_int((int32_t)INT32_MAX);
+  convert_signed_char_to_signed_char((int8_t)INT8_MAX);
+  convert_unsigned_int_to_unsigned_char(~(((uint32_t)INT32_MIN) | ((uint32_t)(uint8_t)INT8_MIN)));
+// CHECK-V7: {{.*}}integer-conversion.c:500:10: runtime error: implicit conversion from type 'unsigned int' of value 2147483519 (32-bit, unsigned) to type 'unsigned char' changed the value to 127 (8-bit, unsigned)
+  convert_unsigned_char_to_unsigned_int((uint8_t)INT8_MAX);
+  convert_unsigned_char_to_signed_int((uint8_t)INT8_MAX);
+  convert_signed_char_to_signed_int((int8_t)INT8_MAX);
+  convert_unsigned_int_to_signed_int((uint32_t)INT32_MAX);
+  convert_signed_int_to_unsigned_int((uint32_t)INT32_MAX);
+  convert_signed_int_to_unsigned_char((int32_t)(~(((uint32_t)INT32_MIN) | ((uint32_t)(uint8_t)INT8_MIN))));
+// CHECK-V7: {{.*}}integer-conversion.c:1100:10: runtime error: implicit conversion from type 'int' of value 2147483519 (32-bit, signed) to type 'unsigned char' changed the value to 127 (8-bit, unsigned)
+  convert_signed_char_to_unsigned_char((int8_t)INT8_MAX);
+  convert_unsigned_char_to_signed_char((uint8_t)INT8_MAX);
+  convert_signed_char_to_unsigned_int((int8_t)INT8_MAX);
+  convert_unsigned_int_to_signed_char(~(((uint32_t)INT32_MIN) | ((uint32_t)(uint8_t)INT8_MIN)));
+// CHECK-V7: {{.*}}integer-conversion.c:1500:10: runtime error: implicit conversion from type 'unsigned int' of value 2147483519 (32-bit, unsigned) to type 'signed char' changed the value to 127 (8-bit, signed)
+  convert_signed_int_to_signed_char((int32_t)~(((uint32_t)INT32_MIN) | ((uint32_t)(uint8_t)INT8_MIN)));
+// CHECK-V7: {{.*}}integer-conversion.c:1600:10: runtime error: implicit conversion from type 'int' of value 2147483519 (32-bit, signed) to type 'signed char' changed the value to 127 (8-bit, signed)
 #else
 #error Some V* needs to be defined!
 #endif
-}
-
-// CHECK-NOT: implicit conversion
-
-int main() {
-  test_positives();
 
   return 0;
 }

Modified: compiler-rt/trunk/test/ubsan/TestCases/ImplicitConversion/integer-truncation.c
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/ubsan/TestCases/ImplicitConversion/integer-truncation.c?rev=343250&r1=343249&r2=343250&view=diff
==============================================================================
--- compiler-rt/trunk/test/ubsan/TestCases/ImplicitConversion/integer-truncation.c (original)
+++ compiler-rt/trunk/test/ubsan/TestCases/ImplicitConversion/integer-truncation.c Thu Sep 27 12:07:47 2018
@@ -1,63 +1,324 @@
-// RUN: %clang   -x c   -fsanitize=implicit-integer-truncation %s -o %t && %run %t 2>&1 | FileCheck %s --check-prefixes=CHECK
-// RUN: %clangxx -x c++ -fsanitize=implicit-integer-truncation %s -o %t && %run %t 2>&1 | FileCheck %s --check-prefixes=CHECK
+// RUN: %clang   -x c   -fsanitize=implicit-integer-truncation %s -DV0 -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not="implicit conversion" --check-prefixes=CHECK-V0
+// RUN: %clang   -x c   -fsanitize=implicit-integer-truncation %s -DV1 -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not="implicit conversion" --check-prefixes=CHECK-V1
+// RUN: %clang   -x c   -fsanitize=implicit-integer-truncation %s -DV2 -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not="implicit conversion" --check-prefixes=CHECK-V2
+// RUN: %clang   -x c   -fsanitize=implicit-integer-truncation %s -DV3 -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not="implicit conversion" --check-prefixes=CHECK-V3
+// RUN: %clang   -x c   -fsanitize=implicit-integer-truncation %s -DV4 -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not="implicit conversion" --check-prefixes=CHECK-V4
+// RUN: %clang   -x c   -fsanitize=implicit-integer-truncation %s -DV5 -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not="implicit conversion" --check-prefixes=CHECK-V5
+// RUN: %clang   -x c   -fsanitize=implicit-integer-truncation %s -DV6 -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not="implicit conversion" --check-prefixes=CHECK-V6
+// RUN: %clang   -x c   -fsanitize=implicit-integer-truncation %s -DV7 -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not="implicit conversion" --check-prefixes=CHECK-V7
+
+// RUN: %clang   -x c++ -fsanitize=implicit-integer-truncation %s -DV0 -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not="implicit conversion" --check-prefixes=CHECK-V0
+// RUN: %clang   -x c++ -fsanitize=implicit-integer-truncation %s -DV1 -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not="implicit conversion" --check-prefixes=CHECK-V1
+// RUN: %clang   -x c++ -fsanitize=implicit-integer-truncation %s -DV2 -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not="implicit conversion" --check-prefixes=CHECK-V2
+// RUN: %clang   -x c++ -fsanitize=implicit-integer-truncation %s -DV3 -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not="implicit conversion" --check-prefixes=CHECK-V3
+// RUN: %clang   -x c++ -fsanitize=implicit-integer-truncation %s -DV4 -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not="implicit conversion" --check-prefixes=CHECK-V4
+// RUN: %clang   -x c++ -fsanitize=implicit-integer-truncation %s -DV5 -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not="implicit conversion" --check-prefixes=CHECK-V5
+// RUN: %clang   -x c++ -fsanitize=implicit-integer-truncation %s -DV6 -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not="implicit conversion" --check-prefixes=CHECK-V6
+// RUN: %clang   -x c++ -fsanitize=implicit-integer-truncation %s -DV7 -o %t && %run %t 2>&1 | FileCheck %s --implicit-check-not="implicit conversion" --check-prefixes=CHECK-V7
 
 #include <stdint.h>
 
-#if !defined(__cplusplus)
-#define bool _Bool
-#endif
+// Test plan:
+//  * Two types - int and char
+//  * Two signs - signed and unsigned
+//  * Square that - we have input and output types.
+// Thus, there are total of (2*2)^2 == 16 tests.
+// These are all the possible variations/combinations of casts.
+// However, not all of them should result in the check.
+// So here, we *only* check which should and which should not result in checks.
+
+unsigned int convert_unsigned_int_to_unsigned_int(unsigned int x) {
+#line 100
+  return x;
+}
 
-int main() {
-// CHECK-NOT: integer-truncation.c
+unsigned char convert_unsigned_char_to_unsigned_char(unsigned char x) {
+#line 200
+  return x;
+}
 
-  // 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;
-
-  // Explicit casts
-  uint8_t i0 = (uint8_t)(~((uint32_t)0));
-
-#if defined(__cplusplus)
-  uint8_t i1 = uint8_t(~(uint32_t(0)));
-  uint8_t i2 = static_cast<uint8_t>(~(uint32_t(0)));
-#endif
+signed int convert_signed_int_to_signed_int(signed int x) {
+#line 300
+  return x;
+}
 
-  // Positive tests.
+signed char convert_signed_char_to_signed_char(signed char x) {
+#line 400
+  return x;
+}
 
-  uint8_t t_b0 = (~((uint16_t)(0)));
-// CHECK: {{.*}}integer-truncation.c:[[@LINE-1]]:18: runtime error: implicit conversion from type 'int' of value -1 (32-bit, signed) to type 'uint8_t' (aka 'unsigned char') changed the value to 255 (8-bit, unsigned)
+unsigned char convert_unsigned_int_to_unsigned_char(unsigned int x) {
+#line 500
+  return x;
+}
 
-  uint8_t t_b1 = (~((uint32_t)0));
-// CHECK: {{.*}}integer-truncation.c:[[@LINE-1]]:18: runtime error: implicit conversion from type 'uint32_t' (aka 'unsigned int') of value 4294967295 (32-bit, unsigned) to type 'uint8_t' (aka 'unsigned char') changed the value to 255 (8-bit, unsigned)
-  uint16_t t_b2 = (~((uint32_t)0));
-// CHECK: {{.*}}integer-truncation.c:[[@LINE-1]]:19: runtime error: implicit conversion from type 'uint32_t' (aka 'unsigned int') of value 4294967295 (32-bit, unsigned) to type 'uint16_t' (aka 'unsigned short') changed the value to 65535 (16-bit, unsigned)
-
-  uint8_t t_b3 = ~((uint64_t)0);
-// CHECK: {{.*}}integer-truncation.c:[[@LINE-1]]:18: runtime error: implicit conversion from type 'uint64_t' (aka 'unsigned long{{[^']*}}') of value 18446744073709551615 (64-bit, unsigned) to type 'uint8_t' (aka 'unsigned char') changed the value to 255 (8-bit, unsigned)
-  uint16_t t_b4 = ~((uint64_t)0);
-// CHECK: {{.*}}integer-truncation.c:[[@LINE-1]]:19: runtime error: implicit conversion from type 'uint64_t' (aka 'unsigned long{{[^']*}}') of value 18446744073709551615 (64-bit, unsigned) to type 'uint16_t' (aka 'unsigned short') changed the value to 65535 (16-bit, unsigned)
-  uint32_t t_b5 = ~((uint64_t)0);
-// CHECK: {{.*}}integer-truncation.c:[[@LINE-1]]:19: runtime error: implicit conversion from type 'uint64_t' (aka 'unsigned long{{[^']*}}') of value 18446744073709551615 (64-bit, unsigned) to type 'uint32_t' (aka 'unsigned int') changed the value to 4294967295 (32-bit, unsigned)
-
-  int8_t t1 = 255;
-// CHECK: {{.*}}integer-truncation.c:[[@LINE-1]]:15: runtime error: implicit conversion from type 'int' of value 255 (32-bit, signed) to type 'int8_t' (aka 'signed char') changed the value to -1 (8-bit, signed)
-  uint8_t t2 = 256;
-// CHECK: {{.*}}integer-truncation.c:[[@LINE-1]]:16: runtime error: implicit conversion from type 'int' of value 256 (32-bit, signed) to type 'uint8_t' (aka 'unsigned char') changed the value to 0 (8-bit, unsigned)
-  int8_t t3 = 256;
-// CHECK: {{.*}}integer-truncation.c:[[@LINE-1]]:15: runtime error: implicit conversion from type 'int' of value 256 (32-bit, signed) to type 'int8_t' (aka 'signed char') changed the value to 0 (8-bit, signed)
-  uint8_t t4 = 257;
-// CHECK: {{.*}}integer-truncation.c:[[@LINE-1]]:16: runtime error: implicit conversion from type 'int' of value 257 (32-bit, signed) to type 'uint8_t' (aka 'unsigned char') changed the value to 1 (8-bit, unsigned)
-  int8_t t5 = 257;
-// CHECK: {{.*}}integer-truncation.c:[[@LINE-1]]:15: runtime error: implicit conversion from type 'int' of value 257 (32-bit, signed) to type 'int8_t' (aka 'signed char') changed the value to 1 (8-bit, signed)
-  int8_t t6 = 128;
-// CHECK: {{.*}}integer-truncation.c:[[@LINE-1]]:15: runtime error: implicit conversion from type 'int' of value 128 (32-bit, signed) to type 'int8_t' (aka 'signed char') changed the value to -128 (8-bit, signed)
+unsigned int convert_unsigned_char_to_unsigned_int(unsigned char x) {
+#line 600
+  return x;
+}
+
+signed int convert_unsigned_char_to_signed_int(unsigned char x) {
+#line 700
+  return x;
+}
+
+signed int convert_signed_char_to_signed_int(signed char x) {
+#line 800
+  return x;
+}
+
+signed int convert_unsigned_int_to_signed_int(unsigned int x) {
+#line 900
+  return x;
+}
+
+unsigned int convert_signed_int_to_unsigned_int(signed int x) {
+#line 1000
+  return x;
+}
+
+unsigned char convert_signed_int_to_unsigned_char(signed int x) {
+#line 1100
+  return x;
+}
+
+unsigned char convert_signed_char_to_unsigned_char(signed char x) {
+#line 1200
+  return x;
+}
+
+signed char convert_unsigned_char_to_signed_char(unsigned char x) {
+#line 1300
+  return x;
+}
+
+unsigned int convert_signed_char_to_unsigned_int(signed char x) {
+#line 1400
+  return x;
+}
+
+signed char convert_unsigned_int_to_signed_char(unsigned int x) {
+#line 1500
+  return x;
+}
+
+signed char convert_signed_int_to_signed_char(signed int x) {
+#line 1600
+  return x;
+}
+
+#line 1111 // !!!
+
+int main() {
+  // No bits set.
+  convert_unsigned_int_to_unsigned_int(0);
+  convert_unsigned_char_to_unsigned_char(0);
+  convert_signed_int_to_signed_int(0);
+  convert_signed_char_to_signed_char(0);
+  convert_unsigned_int_to_unsigned_char(0);
+  convert_unsigned_char_to_unsigned_int(0);
+  convert_unsigned_char_to_signed_int(0);
+  convert_signed_char_to_signed_int(0);
+  convert_unsigned_int_to_signed_int(0);
+  convert_signed_int_to_unsigned_int(0);
+  convert_signed_int_to_unsigned_char(0);
+  convert_signed_char_to_unsigned_char(0);
+  convert_unsigned_char_to_signed_char(0);
+  convert_signed_char_to_unsigned_int(0);
+  convert_unsigned_int_to_signed_char(0);
+  convert_signed_int_to_signed_char(0);
+
+  // One lowest bit set.
+  convert_unsigned_int_to_unsigned_int(1);
+  convert_unsigned_char_to_unsigned_char(1);
+  convert_signed_int_to_signed_int(1);
+  convert_signed_char_to_signed_char(1);
+  convert_unsigned_int_to_unsigned_char(1);
+  convert_unsigned_char_to_unsigned_int(1);
+  convert_unsigned_char_to_signed_int(1);
+  convert_signed_char_to_signed_int(1);
+  convert_unsigned_int_to_signed_int(1);
+  convert_signed_int_to_unsigned_int(1);
+  convert_signed_int_to_unsigned_char(1);
+  convert_signed_char_to_unsigned_char(1);
+  convert_unsigned_char_to_signed_char(1);
+  convert_signed_char_to_unsigned_int(1);
+  convert_unsigned_int_to_signed_char(1);
+  convert_signed_int_to_signed_char(1);
+
+#if defined(V0)
+  // All source bits set.
+  convert_unsigned_int_to_unsigned_int((uint32_t)UINT32_MAX);
+  convert_unsigned_char_to_unsigned_char((uint8_t)UINT8_MAX);
+  convert_signed_int_to_signed_int((int32_t)(uint32_t)UINT32_MAX);
+  convert_signed_char_to_signed_char((int8_t)UINT8_MAX);
+  convert_unsigned_int_to_unsigned_char((uint32_t)UINT32_MAX);
+// CHECK-V0: {{.*}}integer-truncation.c:500:10: runtime error: implicit conversion from type 'unsigned int' of value 4294967295 (32-bit, unsigned) to type 'unsigned char' changed the value to 255 (8-bit, unsigned
+  convert_unsigned_char_to_unsigned_int((uint8_t)UINT8_MAX);
+  convert_unsigned_char_to_signed_int((uint8_t)UINT8_MAX);
+  convert_signed_char_to_signed_int((int8_t)UINT8_MAX);
+  convert_unsigned_int_to_signed_int((uint32_t)UINT32_MAX);
+  convert_signed_int_to_unsigned_int((int32_t)(uint32_t)UINT32_MAX);
+  convert_signed_int_to_unsigned_char((int32_t)(uint32_t)UINT32_MAX);
+// CHECK-V0: {{.*}}integer-truncation.c:1100:10: runtime error: implicit conversion from type 'int' of value -1 (32-bit, signed) to type 'unsigned char' changed the value to 255 (8-bit, unsigned)
+  convert_signed_char_to_unsigned_char((int8_t)UINT8_MAX);
+  convert_unsigned_char_to_signed_char((uint8_t)UINT8_MAX);
+  convert_signed_char_to_unsigned_int((int8_t)UINT8_MAX);
+  convert_unsigned_int_to_signed_char((uint32_t)UINT32_MAX);
+  convert_signed_int_to_signed_char((int32_t)(uint32_t)UINT32_MAX);
+#elif defined(V1)
+   // Source 'Sign' bit set.
+  convert_unsigned_int_to_unsigned_int((uint32_t)INT32_MIN);
+  convert_unsigned_char_to_unsigned_char((uint8_t)INT8_MIN);
+  convert_signed_int_to_signed_int((int32_t)(uint32_t)INT32_MIN);
+  convert_signed_char_to_signed_char((int8_t)INT8_MIN);
+  convert_unsigned_int_to_unsigned_char((uint32_t)INT32_MIN);
+// CHECK-V1: {{.*}}integer-truncation.c:500:10: runtime error: implicit conversion from type 'unsigned int' of value 2147483648 (32-bit, unsigned) to type 'unsigned char' changed the value to 0 (8-bit, unsigned)
+  convert_unsigned_char_to_unsigned_int((uint8_t)INT8_MIN);
+  convert_unsigned_char_to_signed_int((uint8_t)INT8_MIN);
+  convert_signed_char_to_signed_int((int8_t)INT8_MIN);
+  convert_unsigned_int_to_signed_int((uint32_t)INT32_MIN);
+  convert_signed_int_to_unsigned_int((int32_t)(uint32_t)INT32_MIN);
+  convert_signed_int_to_unsigned_char((int32_t)(uint32_t)INT32_MIN);
+// CHECK-V1: {{.*}}integer-truncation.c:1100:10: runtime error: implicit conversion from type 'int' of value -2147483648 (32-bit, signed) to type 'unsigned char' changed the value to 0 (8-bit, unsigned)
+  convert_signed_char_to_unsigned_char((int8_t)INT8_MIN);
+  convert_unsigned_char_to_signed_char((uint8_t)INT8_MIN);
+  convert_signed_char_to_unsigned_int((int8_t)INT8_MIN);
+  convert_unsigned_int_to_signed_char((uint32_t)INT32_MIN);
+// CHECK-V1: {{.*}}integer-truncation.c:1500:10: runtime error: implicit conversion from type 'unsigned int' of value 2147483648 (32-bit, unsigned) to type 'signed char' changed the value to 0 (8-bit, signed)
+  convert_signed_int_to_signed_char((int32_t)(uint32_t)INT32_MIN);
+// CHECK-V1: {{.*}}integer-truncation.c:1600:10: runtime error: implicit conversion from type 'int' of value -2147483648 (32-bit, signed) to type 'signed char' changed the value to 0 (8-bit, signed)
+#elif defined(V2)
+  // All bits except the source 'Sign' bit are set.
+  convert_unsigned_int_to_unsigned_int((uint32_t)INT32_MAX);
+  convert_unsigned_char_to_unsigned_char((uint8_t)INT8_MAX);
+  convert_signed_int_to_signed_int((int32_t)(uint32_t)INT32_MAX);
+  convert_signed_char_to_signed_char((int8_t)INT8_MAX);
+  convert_unsigned_int_to_unsigned_char((uint32_t)INT32_MAX);
+// CHECK-V2: {{.*}}integer-truncation.c:500:10: runtime error: implicit conversion from type 'unsigned int' of value 2147483647 (32-bit, unsigned) to type 'unsigned char' changed the value to 255 (8-bit, unsigned)
+  convert_unsigned_char_to_unsigned_int((uint8_t)INT8_MAX);
+  convert_unsigned_char_to_signed_int((uint8_t)INT8_MAX);
+  convert_signed_char_to_signed_int((int8_t)INT8_MAX);
+  convert_unsigned_int_to_signed_int((uint32_t)INT32_MAX);
+  convert_signed_int_to_unsigned_int((int32_t)(uint32_t)INT32_MAX);
+  convert_signed_int_to_unsigned_char((int32_t)(uint32_t)INT32_MAX);
+// CHECK-V2: {{.*}}integer-truncation.c:1100:10: runtime error: implicit conversion from type 'int' of value 2147483647 (32-bit, signed) to type 'unsigned char' changed the value to 255 (8-bit, unsigned)
+  convert_signed_char_to_unsigned_char((int8_t)INT8_MAX);
+  convert_unsigned_char_to_signed_char((uint8_t)INT8_MAX);
+  convert_signed_char_to_unsigned_int((int8_t)INT8_MAX);
+  convert_unsigned_int_to_signed_char((uint32_t)INT32_MAX);
+// CHECK-V2: {{.*}}integer-truncation.c:1500:10: runtime error: implicit conversion from type 'unsigned int' of value 2147483647 (32-bit, unsigned) to type 'signed char' changed the value to -1 (8-bit, signed)
+  convert_signed_int_to_signed_char((int32_t)(uint32_t)INT32_MAX);
+// CHECK-V2: {{.*}}integer-truncation.c:1600:10: runtime error: implicit conversion from type 'int' of value 2147483647 (32-bit, signed) to type 'signed char' changed the value to -1 (8-bit, signed)
+#elif defined(V3)
+  // All destination bits set.
+  convert_unsigned_int_to_unsigned_int((uint32_t)UINT8_MAX);
+  convert_unsigned_char_to_unsigned_char((uint8_t)UINT8_MAX);
+  convert_signed_int_to_signed_int((int32_t)(uint32_t)UINT8_MAX);
+  convert_signed_char_to_signed_char((int8_t)UINT8_MAX);
+  convert_unsigned_int_to_unsigned_char((uint32_t)UINT8_MAX);
+  convert_unsigned_char_to_unsigned_int((uint8_t)UINT8_MAX);
+  convert_unsigned_char_to_signed_int((uint8_t)UINT8_MAX);
+  convert_signed_char_to_signed_int((int8_t)UINT8_MAX);
+  convert_unsigned_int_to_signed_int((uint32_t)UINT8_MAX);
+  convert_signed_int_to_unsigned_int((int32_t)(uint32_t)UINT8_MAX);
+  convert_signed_int_to_unsigned_char((int32_t)(uint32_t)UINT8_MAX);
+  convert_signed_char_to_unsigned_char((int8_t)UINT8_MAX);
+  convert_unsigned_char_to_signed_char((uint8_t)UINT8_MAX);
+  convert_signed_char_to_unsigned_int((int8_t)UINT8_MAX);
+  convert_unsigned_int_to_signed_char((uint32_t)UINT8_MAX);
+// CHECK-V3: {{.*}}integer-truncation.c:1500:10: runtime error: implicit conversion from type 'unsigned int' of value 255 (32-bit, unsigned) to type 'signed char' changed the value to -1 (8-bit, signed)
+  convert_signed_int_to_signed_char((int32_t)(uint32_t)UINT8_MAX);
+// CHECK-V3: {{.*}}integer-truncation.c:1600:10: runtime error: implicit conversion from type 'int' of value 255 (32-bit, signed) to type 'signed char' changed the value to -1 (8-bit, signed)
+#elif defined(V4)
+  // Destination 'sign' bit set.
+  convert_unsigned_int_to_unsigned_int((uint32_t)(uint8_t)INT8_MIN);
+  convert_unsigned_char_to_unsigned_char((uint8_t)(uint8_t)INT8_MIN);
+  convert_signed_int_to_signed_int((int32_t)(uint32_t)(uint8_t)INT8_MIN);
+  convert_signed_char_to_signed_char((int8_t)(uint8_t)INT8_MIN);
+  convert_unsigned_int_to_unsigned_char((uint32_t)(uint8_t)INT8_MIN);
+  convert_unsigned_char_to_unsigned_int((uint8_t)(uint8_t)INT8_MIN);
+  convert_unsigned_char_to_signed_int((uint8_t)(uint8_t)INT8_MIN);
+  convert_signed_char_to_signed_int((int8_t)(uint8_t)INT8_MIN);
+  convert_unsigned_int_to_signed_int((uint32_t)(uint8_t)INT8_MIN);
+  convert_signed_int_to_unsigned_int((int32_t)(uint32_t)(uint8_t)INT8_MIN);
+  convert_signed_int_to_unsigned_char((int32_t)(uint32_t)(uint8_t)INT8_MIN);
+  convert_signed_char_to_unsigned_char((int8_t)(uint8_t)INT8_MIN);
+  convert_unsigned_char_to_signed_char((uint8_t)(uint8_t)INT8_MIN);
+  convert_signed_char_to_unsigned_int((int8_t)(uint8_t)INT8_MIN);
+  convert_unsigned_int_to_signed_char((uint32_t)(uint8_t)INT8_MIN);
+// CHECK-V4: {{.*}}integer-truncation.c:1500:10: runtime error: implicit conversion from type 'unsigned int' of value 128 (32-bit, unsigned) to type 'signed char' changed the value to -128 (8-bit, signed)
+  convert_signed_int_to_signed_char((int32_t)(uint32_t)(uint8_t)INT8_MIN);
+// CHECK-V4: {{.*}}integer-truncation.c:1600:10: runtime error: implicit conversion from type 'int' of value 128 (32-bit, signed) to type 'signed char' changed the value to -128 (8-bit, signed)
+#elif defined(V5)
+  // All bits except the destination 'sign' bit are set.
+  convert_unsigned_int_to_unsigned_int((~((uint32_t)(uint8_t)INT8_MIN)));
+  convert_unsigned_char_to_unsigned_char((uint8_t)(uint8_t)INT8_MIN);
+  convert_signed_int_to_signed_int((int32_t)(~((uint32_t)(uint8_t)INT8_MIN)));
+  convert_signed_char_to_signed_char((int8_t)(uint8_t)INT8_MIN);
+  convert_unsigned_int_to_unsigned_char((~((uint32_t)(uint8_t)INT8_MIN)));
+// CHECK-V5: {{.*}}integer-truncation.c:500:10: runtime error: implicit conversion from type 'unsigned int' of value 4294967167 (32-bit, unsigned) to type 'unsigned char' changed the value to 127 (8-bit, unsigned)
+  convert_unsigned_char_to_unsigned_int((uint8_t)(uint8_t)INT8_MIN);
+  convert_unsigned_char_to_signed_int((uint8_t)(uint8_t)INT8_MIN);
+  convert_signed_char_to_signed_int((int8_t)(uint8_t)INT8_MIN);
+  convert_unsigned_int_to_signed_int((~((uint32_t)(uint8_t)INT8_MIN)));
+  convert_signed_int_to_unsigned_int((int32_t)(~((uint32_t)(uint8_t)INT8_MIN)));
+  convert_signed_int_to_unsigned_char((int32_t)(~((uint32_t)(uint8_t)INT8_MIN)));
+// CHECK-V5: {{.*}}integer-truncation.c:1100:10: runtime error: implicit conversion from type 'int' of value -129 (32-bit, signed) to type 'unsigned char' changed the value to 127 (8-bit, unsigned)
+  convert_signed_char_to_unsigned_char((int8_t)(uint8_t)INT8_MIN);
+  convert_unsigned_char_to_signed_char((uint8_t)(uint8_t)INT8_MIN);
+  convert_signed_char_to_unsigned_int((int8_t)(uint8_t)INT8_MIN);
+  convert_unsigned_int_to_signed_char((~((uint32_t)(uint8_t)INT8_MIN)));
+// CHECK-V5: {{.*}}integer-truncation.c:1500:10: runtime error: implicit conversion from type 'unsigned int' of value 4294967167 (32-bit, unsigned) to type 'signed char' changed the value to 127 (8-bit, signed)
+  convert_signed_int_to_signed_char((int32_t)(~((uint32_t)(uint8_t)INT8_MIN)));
+// CHECK-V5: {{.*}}integer-truncation.c:1600:10: runtime error: implicit conversion from type 'int' of value -129 (32-bit, signed) to type 'signed char' changed the value to 127 (8-bit, signed)
+#elif defined(V6)
+  // Only the source and destination sign bits are set.
+  convert_unsigned_int_to_unsigned_int((uint32_t)INT32_MIN);
+  convert_unsigned_char_to_unsigned_char((uint8_t)INT8_MIN);
+  convert_signed_int_to_signed_int((int32_t)INT32_MIN);
+  convert_signed_char_to_signed_char((int8_t)INT8_MIN);
+  convert_unsigned_int_to_unsigned_char(((uint32_t)INT32_MIN) | ((uint32_t)(uint8_t)INT8_MIN));
+// CHECK-V6: {{.*}}integer-truncation.c:500:10: runtime error: implicit conversion from type 'unsigned int' of value 2147483776 (32-bit, unsigned) to type 'unsigned char' changed the value to 128 (8-bit, unsigned)
+  convert_unsigned_char_to_unsigned_int((uint8_t)INT8_MIN);
+  convert_unsigned_char_to_signed_int((uint8_t)INT8_MIN);
+  convert_signed_char_to_signed_int((int8_t)INT8_MIN);
+  convert_unsigned_int_to_signed_int((uint32_t)INT32_MIN);
+  convert_signed_int_to_unsigned_int((uint32_t)INT32_MIN);
+  convert_signed_int_to_unsigned_char((int32_t)(((uint32_t)INT32_MIN) | ((uint32_t)(uint8_t)INT8_MIN)));
+// CHECK-V6: {{.*}}integer-truncation.c:1100:10: runtime error: implicit conversion from type 'int' of value -2147483520 (32-bit, signed) to type 'unsigned char' changed the value to 128 (8-bit, unsigned)
+  convert_signed_char_to_unsigned_char((int8_t)INT8_MIN);
+  convert_unsigned_char_to_signed_char((uint8_t)INT8_MIN);
+  convert_signed_char_to_unsigned_int((int8_t)INT8_MIN);
+  convert_unsigned_int_to_signed_char((((uint32_t)INT32_MIN) | ((uint32_t)(uint8_t)INT8_MIN)));
+// CHECK-V6: {{.*}}integer-truncation.c:1500:10: runtime error: implicit conversion from type 'unsigned int' of value 2147483776 (32-bit, unsigned) to type 'signed char' changed the value to -128 (8-bit, signed)
+  convert_signed_int_to_signed_char((int32_t)(((uint32_t)INT32_MIN) | ((uint32_t)(uint8_t)INT8_MIN)));
+// CHECK-V6: {{.*}}integer-truncation.c:1600:10: runtime error: implicit conversion from type 'int' of value -2147483520 (32-bit, signed) to type 'signed char' changed the value to -128 (8-bit, signed)
+#elif defined(V7)
+  // All bits except the source and destination sign bits are set.
+  convert_unsigned_int_to_unsigned_int((uint32_t)INT32_MAX);
+  convert_unsigned_char_to_unsigned_char((uint8_t)INT8_MAX);
+  convert_signed_int_to_signed_int((int32_t)INT32_MAX);
+  convert_signed_char_to_signed_char((int8_t)INT8_MAX);
+  convert_unsigned_int_to_unsigned_char(~(((uint32_t)INT32_MIN) | ((uint32_t)(uint8_t)INT8_MIN)));
+// CHECK-V7: {{.*}}integer-truncation.c:500:10: runtime error: implicit conversion from type 'unsigned int' of value 2147483519 (32-bit, unsigned) to type 'unsigned char' changed the value to 127 (8-bit, unsigned)
+  convert_unsigned_char_to_unsigned_int((uint8_t)INT8_MAX);
+  convert_unsigned_char_to_signed_int((uint8_t)INT8_MAX);
+  convert_signed_char_to_signed_int((int8_t)INT8_MAX);
+  convert_unsigned_int_to_signed_int((uint32_t)INT32_MAX);
+  convert_signed_int_to_unsigned_int((uint32_t)INT32_MAX);
+  convert_signed_int_to_unsigned_char((int32_t)(~(((uint32_t)INT32_MIN) | ((uint32_t)(uint8_t)INT8_MIN))));
+// CHECK-V7: {{.*}}integer-truncation.c:1100:10: runtime error: implicit conversion from type 'int' of value 2147483519 (32-bit, signed) to type 'unsigned char' changed the value to 127 (8-bit, unsigned)
+  convert_signed_char_to_unsigned_char((int8_t)INT8_MAX);
+  convert_unsigned_char_to_signed_char((uint8_t)INT8_MAX);
+  convert_signed_char_to_unsigned_int((int8_t)INT8_MAX);
+  convert_unsigned_int_to_signed_char(~(((uint32_t)INT32_MIN) | ((uint32_t)(uint8_t)INT8_MIN)));
+// CHECK-V7: {{.*}}integer-truncation.c:1500:10: runtime error: implicit conversion from type 'unsigned int' of value 2147483519 (32-bit, unsigned) to type 'signed char' changed the value to 127 (8-bit, signed)
+  convert_signed_int_to_signed_char((int32_t)~(((uint32_t)INT32_MIN) | ((uint32_t)(uint8_t)INT8_MIN)));
+// CHECK-V7: {{.*}}integer-truncation.c:1600:10: runtime error: implicit conversion from type 'int' of value 2147483519 (32-bit, signed) to type 'signed char' changed the value to 127 (8-bit, signed)
+#else
+#error Some V* needs to be defined!
+#endif
 
   return 0;
 }




More information about the llvm-commits mailing list