• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // RUN: %clang_cc1 -fsanitize=implicit-signed-integer-truncation -fsanitize-recover=implicit-signed-integer-truncation -emit-llvm %s -o - -triple x86_64-linux-gnu | FileCheck %s -implicit-check-not="call void @__ubsan_handle_implicit_conversion" --check-prefixes=CHECK
2 
3 // Test plan:
4 //  * Two types - int and char
5 //  * Two signs - signed and unsigned
6 //  * Square that - we have input and output types.
7 // Thus, there are total of (2*2)^2 == 16 tests.
8 // These are all the possible variations/combinations of casts.
9 // However, not all of them should result in the check.
10 // So here, we *only* check which should and which should not result in checks.
11 
12 // CHECK-DAG: @[[LINE_1100_SIGNED_TRUNCATION:.*]] = {{.*}}, i32 1100, i32 10 }, {{.*}}, {{.*}}, i8 2 }
13 // CHECK-DAG: @[[LINE_1500_SIGNED_TRUNCATION:.*]] = {{.*}}, i32 1500, i32 10 }, {{.*}}, {{.*}}, i8 2 }
14 // CHECK-DAG: @[[LINE_1600_SIGNED_TRUNCATION:.*]] = {{.*}}, i32 1600, i32 10 }, {{.*}}, {{.*}}, i8 2 }
15 
16 // CHECK-LABEL: @convert_unsigned_int_to_unsigned_int
convert_unsigned_int_to_unsigned_int(unsigned int x)17 unsigned int convert_unsigned_int_to_unsigned_int(unsigned int x) {
18 #line 100
19   return x;
20 }
21 
22 // CHECK-LABEL: @convert_unsigned_char_to_unsigned_char
convert_unsigned_char_to_unsigned_char(unsigned char x)23 unsigned char convert_unsigned_char_to_unsigned_char(unsigned char x) {
24 #line 200
25   return x;
26 }
27 
28 // CHECK-LABEL: @convert_signed_int_to_signed_int
convert_signed_int_to_signed_int(signed int x)29 signed int convert_signed_int_to_signed_int(signed int x) {
30 #line 300
31   return x;
32 }
33 
34 // CHECK-LABEL: @convert_signed_char_to_signed_char
convert_signed_char_to_signed_char(signed char x)35 signed char convert_signed_char_to_signed_char(signed char x) {
36 #line 400
37   return x;
38 }
39 
40 // CHECK-LABEL: @convert_unsigned_int_to_unsigned_char
convert_unsigned_int_to_unsigned_char(unsigned int x)41 unsigned char convert_unsigned_int_to_unsigned_char(unsigned int x) {
42 #line 500
43   return x;
44 }
45 
46 // CHECK-LABEL: @convert_unsigned_char_to_unsigned_int
convert_unsigned_char_to_unsigned_int(unsigned char x)47 unsigned int convert_unsigned_char_to_unsigned_int(unsigned char x) {
48 #line 600
49   return x;
50 }
51 
52 // CHECK-LABEL: @convert_unsigned_char_to_signed_int
convert_unsigned_char_to_signed_int(unsigned char x)53 signed int convert_unsigned_char_to_signed_int(unsigned char x) {
54 #line 700
55   return x;
56 }
57 
58 // CHECK-LABEL: @convert_signed_char_to_signed_int
convert_signed_char_to_signed_int(signed char x)59 signed int convert_signed_char_to_signed_int(signed char x) {
60 #line 800
61   return x;
62 }
63 
64 // CHECK-LABEL: @convert_unsigned_int_to_signed_int
convert_unsigned_int_to_signed_int(unsigned int x)65 signed int convert_unsigned_int_to_signed_int(unsigned int x) {
66 #line 900
67   return x;
68 }
69 
70 // CHECK-LABEL: @convert_signed_int_to_unsigned_int
convert_signed_int_to_unsigned_int(signed int x)71 unsigned int convert_signed_int_to_unsigned_int(signed int x) {
72 #line 1000
73   return x;
74 }
75 
76 // CHECK-LABEL: @convert_signed_int_to_unsigned_char
convert_signed_int_to_unsigned_char(signed int x)77 unsigned char convert_signed_int_to_unsigned_char(signed int x) {
78   // CHECK: call void @__ubsan_handle_implicit_conversion(i8* bitcast ({ {{{.*}}}, {{{.*}}}*, {{{.*}}}*, i8 }* @[[LINE_1100_SIGNED_TRUNCATION]] to i8*)
79 #line 1100
80   return x;
81 }
82 
83 // CHECK-LABEL: @convert_signed_char_to_unsigned_char
convert_signed_char_to_unsigned_char(signed char x)84 unsigned char convert_signed_char_to_unsigned_char(signed char x) {
85 #line 1200
86   return x;
87 }
88 
89 // CHECK-LABEL: @convert_unsigned_char_to_signed_char
convert_unsigned_char_to_signed_char(unsigned char x)90 signed char convert_unsigned_char_to_signed_char(unsigned char x) {
91 #line 1300
92   return x;
93 }
94 
95 // CHECK-LABEL: @convert_signed_char_to_unsigned_int
convert_signed_char_to_unsigned_int(signed char x)96 unsigned int convert_signed_char_to_unsigned_int(signed char x) {
97 #line 1400
98   return x;
99 }
100 
101 // CHECK-LABEL: @convert_unsigned_int_to_signed_char
convert_unsigned_int_to_signed_char(unsigned int x)102 signed char convert_unsigned_int_to_signed_char(unsigned int x) {
103   // CHECK: call void @__ubsan_handle_implicit_conversion(i8* bitcast ({ {{{.*}}}, {{{.*}}}*, {{{.*}}}*, i8 }* @[[LINE_1500_SIGNED_TRUNCATION]] to i8*)
104 #line 1500
105   return x;
106 }
107 
108 // CHECK-LABEL: @convert_signed_int_to_signed_char
convert_signed_int_to_signed_char(signed int x)109 signed char convert_signed_int_to_signed_char(signed int x) {
110   // CHECK: call void @__ubsan_handle_implicit_conversion(i8* bitcast ({ {{{.*}}}, {{{.*}}}*, {{{.*}}}*, i8 }* @[[LINE_1600_SIGNED_TRUNCATION]] to i8*)
111 #line 1600
112   return x;
113 }
114