274 lines · c
1// RUN: %clang_cc1 -emit-llvm %s -o - -triple x86_64-linux-gnu | FileCheck %s --check-prefix=CHECK2// RUN: %clang_cc1 -fsanitize=implicit-integer-sign-change -fno-sanitize-recover=implicit-integer-sign-change -emit-llvm %s -o - -triple x86_64-linux-gnu | FileCheck %s -implicit-check-not="call void @__ubsan_handle_implicit_conversion" --check-prefixes=CHECK,CHECK-SANITIZE,CHECK-SANITIZE-ANYRECOVER,CHECK-SANITIZE-NORECOVER,CHECK-SANITIZE-UNREACHABLE3// RUN: %clang_cc1 -fsanitize=implicit-integer-sign-change -fsanitize-recover=implicit-integer-sign-change -emit-llvm %s -o - -triple x86_64-linux-gnu | FileCheck %s -implicit-check-not="call void @__ubsan_handle_implicit_conversion" --check-prefixes=CHECK,CHECK-SANITIZE,CHECK-SANITIZE-ANYRECOVER,CHECK-SANITIZE-RECOVER4// RUN: %clang_cc1 -fsanitize=implicit-integer-sign-change -fsanitize-trap=implicit-integer-sign-change -emit-llvm %s -o - -triple x86_64-linux-gnu | FileCheck %s -implicit-check-not="call void @__ubsan_handle_implicit_conversion" --check-prefixes=CHECK,CHECK-SANITIZE,CHECK-SANITIZE-TRAP,CHECK-SANITIZE-UNREACHABLE5 6// CHECK-SANITIZE-ANYRECOVER: @[[UNSIGNED_INT:.*]] = {{.*}} c"'unsigned int'\00" }7// CHECK-SANITIZE-ANYRECOVER-NEXT: @[[SIGNED_INT:.*]] = {{.*}} c"'int'\00" }8// CHECK-SANITIZE-ANYRECOVER-NEXT: @[[LINE_100:.*]] = {{.*}}, i32 100, i32 10 }, ptr @[[UNSIGNED_INT]], ptr @[[SIGNED_INT]], i8 3, i32 0 }9// CHECK-SANITIZE-ANYRECOVER-NEXT: @[[LINE_200:.*]] = {{.*}}, i32 200, i32 10 }, ptr @[[SIGNED_INT]], ptr @[[UNSIGNED_INT]], i8 3, i32 0 }10// CHECK-SANITIZE-ANYRECOVER-NEXT: @[[UNSIGNED_CHAR:.*]] = {{.*}} c"'unsigned char'\00" }11// CHECK-SANITIZE-ANYRECOVER-NEXT: @[[LINE_300:.*]] = {{.*}}, i32 300, i32 10 }, ptr @[[SIGNED_INT]], ptr @[[UNSIGNED_CHAR]], i8 3, i32 0 }12// CHECK-SANITIZE-ANYRECOVER-NEXT: @[[SIGNED_CHAR:.*]] = {{.*}} c"'signed char'\00" }13// CHECK-SANITIZE-ANYRECOVER-NEXT: @[[LINE_400:.*]] = {{.*}}, i32 400, i32 10 }, ptr @[[SIGNED_CHAR]], ptr @[[UNSIGNED_CHAR]], i8 3, i32 0 }14// CHECK-SANITIZE-ANYRECOVER-NEXT: @[[LINE_500:.*]] = {{.*}}, i32 500, i32 10 }, ptr @[[UNSIGNED_CHAR]], ptr @[[SIGNED_CHAR]], i8 3, i32 0 }15// CHECK-SANITIZE-ANYRECOVER-NEXT: @[[LINE_600:.*]] = {{.*}}, i32 600, i32 10 }, ptr @[[SIGNED_CHAR]], ptr @[[UNSIGNED_INT]], i8 3, i32 0 }16// CHECK-SANITIZE-ANYRECOVER-NEXT: @[[LINE_700:.*]] = {{.*}}, i32 700, i32 10 }, ptr @[[UNSIGNED_INT]], ptr @[[SIGNED_CHAR]], i8 3, i32 0 }17// CHECK-SANITIZE-ANYRECOVER-NEXT: @[[LINE_800:.*]] = {{.*}}, i32 800, i32 10 }, ptr @[[SIGNED_INT]], ptr @[[SIGNED_CHAR]], i8 3, i32 0 }18// CHECK-SANITIZE-ANYRECOVER: @[[UINT32:.*]] = {{.*}} c"'uint32_t' (aka 'unsigned int')\00" }19// CHECK-SANITIZE-ANYRECOVER: @[[INT32:.*]] = {{.*}} c"'int32_t' (aka 'int')\00" }20// CHECK-SANITIZE-ANYRECOVER: @[[LINE_900:.*]] = {{.*}}, i32 900, i32 10 }, ptr @[[UINT32]], ptr @[[INT32]], i8 3, i32 0 }21 22// ========================================================================== //23// The expected true-positives.24// These are implicit, potentially sign-altering, conversions.25// ========================================================================== //26 27// These 3 result (after optimizations) in simple 'icmp sge i32 %src, 0'.28 29// CHECK-LABEL: @unsigned_int_to_signed_int30// CHECK-SAME: i32 noundef %[[SRC:.*]])31signed int unsigned_int_to_signed_int(unsigned int src) {32 // CHECK: %[[SRC_ADDR:.*]] = alloca i3233 // CHECK-NEXT: store i32 %[[SRC]], ptr %[[SRC_ADDR]]34 // CHECK-NEXT: %[[DST:.*]] = load i32, ptr %[[SRC_ADDR]]35 // CHECK-SANITIZE-NEXT: %[[DST_NEGATIVITYCHECK:.*]] = icmp slt i32 %[[DST]], 0, !nosanitize36 // CHECK-SANITIZE-NEXT: %[[SIGNCHANGECHECK:.*]] = icmp eq i1 false, %[[DST_NEGATIVITYCHECK]], !nosanitize37 // CHECK-SANITIZE-NEXT: br i1 %[[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_CONVERSION:[^,]+]],{{.*}} !nosanitize38 // CHECK-SANITIZE: [[HANDLER_IMPLICIT_CONVERSION]]:39 // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTSRC:.*]] = zext i32 %[[DST]] to i64, !nosanitize40 // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTDST:.*]] = zext i32 %[[DST]] to i64, !nosanitize41 // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_100]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize42 // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_100]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize43 // CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize44 // CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize45 // CHECK-SANITIZE: [[CONT]]:46 // CHECK-NEXT: ret i32 %[[DST]]47 // CHECK-NEXT: }48#line 10049 return src;50}51 52// CHECK-LABEL: @signed_int_to_unsigned_int53// CHECK-SAME: i32 noundef %[[SRC:.*]])54unsigned int signed_int_to_unsigned_int(signed int src) {55 // CHECK: %[[SRC_ADDR:.*]] = alloca i3256 // CHECK-NEXT: store i32 %[[SRC]], ptr %[[SRC_ADDR]]57 // CHECK-NEXT: %[[DST:.*]] = load i32, ptr %[[SRC_ADDR]]58 // CHECK-SANITIZE-NEXT: %[[SRC_NEGATIVITYCHECK:.*]] = icmp slt i32 %[[DST]], 0, !nosanitize59 // CHECK-SANITIZE-NEXT: %[[SIGNCHANGECHECK:.*]] = icmp eq i1 %[[SRC_NEGATIVITYCHECK]], false, !nosanitize60 // CHECK-SANITIZE-NEXT: br i1 %[[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_CONVERSION:[^,]+]],{{.*}} !nosanitize61 // CHECK-SANITIZE: [[HANDLER_IMPLICIT_CONVERSION]]:62 // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTSRC:.*]] = zext i32 %[[DST]] to i64, !nosanitize63 // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTDST:.*]] = zext i32 %[[DST]] to i64, !nosanitize64 // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_200]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize65 // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_200]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize66 // CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize67 // CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize68 // CHECK-SANITIZE: [[CONT]]:69 // CHECK-NEXT: ret i32 %[[DST]]70 // CHECK-NEXT: }71#line 20072 return src;73}74 75// CHECK-LABEL: @signed_int_to_unsigned_char76// CHECK-SAME: i32 noundef %[[SRC:.*]])77unsigned char signed_int_to_unsigned_char(signed int src) {78 // CHECK: %[[SRC_ADDR:.*]] = alloca i3279 // CHECK-NEXT: store i32 %[[SRC]], ptr %[[SRC_ADDR]]80 // CHECK-NEXT: %[[DST:.*]] = load i32, ptr %[[SRC_ADDR]]81 // CHECK-NEXT: %[[CONV:.*]] = trunc i32 %[[DST]] to i882 // CHECK-SANITIZE-NEXT: %[[SRC_NEGATIVITYCHECK:.*]] = icmp slt i32 %[[DST]], 0, !nosanitize83 // CHECK-SANITIZE-NEXT: %[[SIGNCHANGECHECK:.*]] = icmp eq i1 %[[SRC_NEGATIVITYCHECK]], false, !nosanitize84 // CHECK-SANITIZE-NEXT: br i1 %[[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_CONVERSION:[^,]+]],{{.*}} !nosanitize85 // CHECK-SANITIZE: [[HANDLER_IMPLICIT_CONVERSION]]:86 // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTSRC:.*]] = zext i32 %[[DST]] to i64, !nosanitize87 // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTCONV:.*]] = zext i8 %[[CONV]] to i64, !nosanitize88 // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_300]], i64 %[[EXTSRC]], i64 %[[EXTCONV]]){{.*}}, !nosanitize89 // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_300]], i64 %[[EXTSRC]], i64 %[[EXTCONV]]){{.*}}, !nosanitize90 // CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize91 // CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize92 // CHECK-SANITIZE: [[CONT]]:93 // CHECK-NEXT: ret i8 %[[CONV]]94 // CHECK-NEXT: }95#line 30096 return src;97}98 99// These 3 result (after optimizations) in simple 'icmp sge i8 %src, 0'100 101// CHECK-LABEL: @signed_char_to_unsigned_char102// CHECK-SAME: (i8 noundef signext %[[SRC:.*]])103unsigned char signed_char_to_unsigned_char(signed char src) {104 // CHECK: %[[SRC_ADDR:.*]] = alloca i8105 // CHECK-NEXT: store i8 %[[SRC]], ptr %[[SRC_ADDR]]106 // CHECK-NEXT: %[[DST:.*]] = load i8, ptr %[[SRC_ADDR]]107 // CHECK-SANITIZE-NEXT: %[[SRC_NEGATIVITYCHECK:.*]] = icmp slt i8 %[[DST]], 0, !nosanitize108 // CHECK-SANITIZE-NEXT: %[[SIGNCHANGECHECK:.*]] = icmp eq i1 %[[SRC_NEGATIVITYCHECK]], false, !nosanitize109 // CHECK-SANITIZE-NEXT: br i1 %[[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_CONVERSION:[^,]+]],{{.*}} !nosanitize110 // CHECK-SANITIZE: [[HANDLER_IMPLICIT_CONVERSION]]:111 // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTSRC:.*]] = zext i8 %[[DST]] to i64, !nosanitize112 // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTDST:.*]] = zext i8 %[[DST]] to i64, !nosanitize113 // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_400]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize114 // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_400]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize115 // CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize116 // CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize117 // CHECK-SANITIZE: [[CONT]]:118 // CHECK-NEXT: ret i8 %[[DST]]119 // CHECK-NEXT: }120#line 400121 return src;122}123 124// CHECK-LABEL: @unsigned_char_to_signed_char125// CHECK-SAME: (i8 noundef zeroext %[[SRC:.*]])126signed char unsigned_char_to_signed_char(unsigned char src) {127 // CHECK: %[[SRC_ADDR:.*]] = alloca i8128 // CHECK-NEXT: store i8 %[[SRC]], ptr %[[SRC_ADDR]]129 // CHECK-NEXT: %[[DST:.*]] = load i8, ptr %[[SRC_ADDR]]130 // CHECK-SANITIZE-NEXT: %[[DST_NEGATIVITYCHECK:.*]] = icmp slt i8 %[[DST]], 0, !nosanitize131 // CHECK-SANITIZE-NEXT: %[[SIGNCHANGECHECK:.*]] = icmp eq i1 false, %[[DST_NEGATIVITYCHECK]], !nosanitize132 // CHECK-SANITIZE-NEXT: br i1 %[[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_CONVERSION:[^,]+]],{{.*}} !nosanitize133 // CHECK-SANITIZE: [[HANDLER_IMPLICIT_CONVERSION]]:134 // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTSRC:.*]] = zext i8 %[[DST]] to i64, !nosanitize135 // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTDST:.*]] = zext i8 %[[DST]] to i64, !nosanitize136 // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_500]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize137 // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_500]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize138 // CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize139 // CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize140 // CHECK-SANITIZE: [[CONT]]:141 // CHECK-NEXT: ret i8 %[[DST]]142 // CHECK-NEXT: }143#line 500144 return src;145}146 147// CHECK-LABEL: @signed_char_to_unsigned_int148// CHECK-SAME: (i8 noundef signext %[[SRC:.*]])149unsigned int signed_char_to_unsigned_int(signed char src) {150 // CHECK: %[[SRC_ADDR:.*]] = alloca i8151 // CHECK-NEXT: store i8 %[[SRC]], ptr %[[SRC_ADDR]]152 // CHECK-NEXT: %[[DST:.*]] = load i8, ptr %[[SRC_ADDR]]153 // CHECK-NEXT: %[[CONV:.*]] = sext i8 %[[DST]] to i32154 // CHECK-SANITIZE-NEXT: %[[SRC_NEGATIVITYCHECK:.*]] = icmp slt i8 %[[DST]], 0, !nosanitize155 // CHECK-SANITIZE-NEXT: %[[SIGNCHANGECHECK:.*]] = icmp eq i1 %[[SRC_NEGATIVITYCHECK]], false, !nosanitize156 // CHECK-SANITIZE-NEXT: br i1 %[[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_CONVERSION:[^,]+]],{{.*}} !nosanitize157 // CHECK-SANITIZE: [[HANDLER_IMPLICIT_CONVERSION]]:158 // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTSRC:.*]] = zext i8 %[[DST]] to i64, !nosanitize159 // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTCONV:.*]] = zext i32 %[[CONV]] to i64, !nosanitize160 // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_600]], i64 %[[EXTSRC]], i64 %[[EXTCONV]]){{.*}}, !nosanitize161 // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_600]], i64 %[[EXTSRC]], i64 %[[EXTCONV]]){{.*}}, !nosanitize162 // CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize163 // CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize164 // CHECK-SANITIZE: [[CONT]]:165 // CHECK-NEXT: ret i32 %[[CONV]]166 // CHECK-NEXT: }167#line 600168 return src;169}170 171// This one result (after optimizations) in 'icmp sge i8 (trunc i32 %src), 0'172 173// CHECK-LABEL: @unsigned_int_to_signed_char174// CHECK-SAME: i32 noundef %[[SRC:.*]])175signed char unsigned_int_to_signed_char(unsigned int src) {176 // CHECK: %[[SRC_ADDR:.*]] = alloca i32177 // CHECK-NEXT: store i32 %[[SRC]], ptr %[[SRC_ADDR]]178 // CHECK-NEXT: %[[DST:.*]] = load i32, ptr %[[SRC_ADDR]]179 // CHECK-NEXT: %[[CONV:.*]] = trunc i32 %[[DST]] to i8180 // CHECK-SANITIZE-NEXT: %[[DST_NEGATIVITYCHECK:.*]] = icmp slt i8 %[[CONV]], 0, !nosanitize181 // CHECK-SANITIZE-NEXT: %[[SIGNCHANGECHECK:.*]] = icmp eq i1 false, %[[DST_NEGATIVITYCHECK]], !nosanitize182 // CHECK-SANITIZE-NEXT: br i1 %[[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_CONVERSION:[^,]+]],{{.*}} !nosanitize183 // CHECK-SANITIZE: [[HANDLER_IMPLICIT_CONVERSION]]:184 // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTSRC:.*]] = zext i32 %[[DST]] to i64, !nosanitize185 // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTCONV:.*]] = zext i8 %[[CONV]] to i64, !nosanitize186 // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_700]], i64 %[[EXTSRC]], i64 %[[EXTCONV]]){{.*}}, !nosanitize187 // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_700]], i64 %[[EXTSRC]], i64 %[[EXTCONV]]){{.*}}, !nosanitize188 // CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize189 // CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize190 // CHECK-SANITIZE: [[CONT]]:191 // CHECK-NEXT: ret i8 %[[CONV]]192 // CHECK-NEXT: }193#line 700194 return src;195}196 197// The worst one: 'xor i1 (icmp sge i8 (trunc i32 %x), 0), (icmp sge i32 %x, 0)'198 199// CHECK-LABEL: @signed_int_to_signed_char200// CHECK-SAME: i32 noundef %[[SRC:.*]])201signed char signed_int_to_signed_char(signed int x) {202 // CHECK: %[[SRC_ADDR:.*]] = alloca i32203 // CHECK-NEXT: store i32 %[[SRC]], ptr %[[SRC_ADDR]]204 // CHECK-NEXT: %[[DST:.*]] = load i32, ptr %[[SRC_ADDR]]205 // CHECK-NEXT: %[[CONV:.*]] = trunc i32 %[[DST]] to i8206 // CHECK-SANITIZE-NEXT: %[[SRC_NEGATIVITYCHECK:.*]] = icmp slt i32 %[[DST]], 0, !nosanitize207 // CHECK-SANITIZE-NEXT: %[[DST_NEGATIVITYCHECK:.*]] = icmp slt i8 %[[CONV]], 0, !nosanitize208 // CHECK-SANITIZE-NEXT: %[[SIGNCHANGECHECK:.*]] = icmp eq i1 %[[SRC_NEGATIVITYCHECK]], %[[DST_NEGATIVITYCHECK]], !nosanitize209 // CHECK-SANITIZE-NEXT: br i1 %[[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_CONVERSION:[^,]+]],{{.*}} !nosanitize210 // CHECK-SANITIZE: [[HANDLER_IMPLICIT_CONVERSION]]:211 // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTSRC:.*]] = zext i32 %[[DST]] to i64, !nosanitize212 // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTCONV:.*]] = zext i8 %[[CONV]] to i64, !nosanitize213 // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_800]], i64 %[[EXTSRC]], i64 %[[EXTCONV]]){{.*}}, !nosanitize214 // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_800]], i64 %[[EXTSRC]], i64 %[[EXTCONV]]){{.*}}, !nosanitize215 // CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize216 // CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize217 // CHECK-SANITIZE: [[CONT]]:218 // CHECK-NEXT: ret i8 %[[CONV]]219 // CHECK-NEXT: }220#line 800221 return x;222}223 224// ========================================================================== //225// Check canonical type stuff226// ========================================================================== //227 228typedef unsigned int uint32_t;229typedef signed int int32_t;230 231// CHECK-LABEL: @uint32_t_to_int32_t232// CHECK-SAME: i32 noundef %[[SRC:.*]])233int32_t uint32_t_to_int32_t(uint32_t src) {234 // CHECK: %[[SRC_ADDR:.*]] = alloca i32235 // CHECK-NEXT: store i32 %[[SRC]], ptr %[[SRC_ADDR]]236 // CHECK-NEXT: %[[DST:.*]] = load i32, ptr %[[SRC_ADDR]]237 // CHECK-SANITIZE-NEXT: %[[DST_NEGATIVITYCHECK:.*]] = icmp slt i32 %[[DST]], 0, !nosanitize238 // CHECK-SANITIZE-NEXT: %[[SIGNCHANGECHECK:.*]] = icmp eq i1 false, %[[DST_NEGATIVITYCHECK]], !nosanitize239 // CHECK-SANITIZE-NEXT: br i1 %[[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_CONVERSION:[^,]+]],{{.*}} !nosanitize240 // CHECK-SANITIZE: [[HANDLER_IMPLICIT_CONVERSION]]:241 // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTSRC:.*]] = zext i32 %[[DST]] to i64, !nosanitize242 // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTDST:.*]] = zext i32 %[[DST]] to i64, !nosanitize243 // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_900]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize244 // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_900]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize245 // CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize246 // CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize247 // CHECK-SANITIZE: [[CONT]]:248 // CHECK-NEXT: ret i32 %[[DST]]249 // CHECK-NEXT: }250#line 900251 return src;252}253 254// ========================================================================== //255// Check that explicit conversion does not interfere with implicit conversion256// ========================================================================== //257// These contain one implicit and one explicit sign-changing conversion.258// We want to make sure that we still diagnose the implicit conversion.259 260// Implicit sign-change after explicit sign-change.261// CHECK-LABEL: @explicit_conversion_interference0262unsigned int explicit_conversion_interference0(unsigned int c) {263 // CHECK-SANITIZE: call264 return (signed int)c;265}266 267// Implicit sign-change before explicit sign-change.268// CHECK-LABEL: @explicit_conversion_interference1269unsigned int explicit_conversion_interference1(unsigned int c) {270 // CHECK-SANITIZE: call271 signed int b;272 return (unsigned int)(b = c);273}274