61 lines · c
1// RUN: %clang -fsanitize=implicit-bitfield-conversion -target x86_64-linux -S -emit-llvm -o - %s | FileCheck %s --check-prefixes=CHECK,CHECK-BITFIELD-CONVERSION2// RUN: %clang -fsanitize=implicit-integer-conversion -target x86_64-linux -S -emit-llvm -o - %s | FileCheck %s --check-prefixes=CHECK3// RUN: %clang -fsanitize=implicit-conversion -target x86_64-linux -S -emit-llvm -o - %s | FileCheck %s --check-prefixes=CHECK,CHECK-BITFIELD-CONVERSION4 5typedef struct _xx {6 int x1:3;7 char x2:2;8} xx, *pxx;9 10xx vxx;11 12// CHECK-LABEL: define{{.*}} void @foo113void foo1(int x) {14 vxx.x1 = x;15 // CHECK: store i8 %{{.*}}16 // CHECK-NEXT: [[BFRESULTSHL:%.*]] = shl i8 {{.*}}, 517 // CHECK-NEXT: [[BFRESULTASHR:%.*]] = ashr i8 [[BFRESULTSHL]], 518 // CHECK-NEXT: [[BFRESULTCAST:%.*]] = sext i8 [[BFRESULTASHR]] to i3219 // CHECK-BITFIELD-CONVERSION: call void @__ubsan_handle_implicit_conversion20 // CHECK-BITFIELD-CONVERSION-NEXT: br label %[[CONT:.*]], !nosanitize21 // CHECK-BITFIELD-CONVERSION: [[CONT]]:22 // CHECK-NEXT: ret void23}24 25// CHECK-LABEL: define{{.*}} void @foo226void foo2(int x) {27 vxx.x2 = x;28 // CHECK: store i8 %{{.*}}29 // CHECK-NEXT: [[BFRESULTSHL:%.*]] = shl i8 {{.*}}, 630 // CHECK-NEXT: [[BFRESULTASHR:%.*]] = ashr i8 [[BFRESULTSHL]], 631 // CHECK-BITFIELD-CONVERSION: call void @__ubsan_handle_implicit_conversion32 // CHECK-BITFIELD-CONVERSION-NEXT: br label %[[CONT:.*]], !nosanitize33 // CHECK-BITFIELD-CONVERSION: [[CONT]]:34 // CHECK-NEXT: ret void35}36 37// CHECK-LABEL: define{{.*}} void @foo338void foo3() {39 vxx.x1++;40 // CHECK: store i8 %{{.*}}41 // CHECK-NEXT: [[BFRESULTSHL:%.*]] = shl i8 {{.*}}, 542 // CHECK-NEXT: [[BFRESULTASHR:%.*]] = ashr i8 [[BFRESULTSHL]], 543 // CHECK-NEXT: [[BFRESULTCAST:%.*]] = sext i8 [[BFRESULTASHR]] to i3244 // CHECK-BITFIELD-CONVERSION: call void @__ubsan_handle_implicit_conversion45 // CHECK-BITFIELD-CONVERSION-NEXT: br label %[[CONT:.*]], !nosanitize46 // CHECK-BITFIELD-CONVERSION: [[CONT]]:47 // CHECK-NEXT: ret void48}49 50// CHECK-LABEL: define{{.*}} void @foo451void foo4(int x) {52 vxx.x1 += x;53 // CHECK: store i8 %{{.*}}54 // CHECK-NEXT: [[BFRESULTSHL:%.*]] = shl i8 {{.*}}, 555 // CHECK-NEXT: [[BFRESULTASHR:%.*]] = ashr i8 [[BFRESULTSHL]], 556 // CHECK-NEXT: [[BFRESULTCAST:%.*]] = sext i8 [[BFRESULTASHR]] to i3257 // CHECK-BITFIELD-CONVERSION: call void @__ubsan_handle_implicit_conversion58 // CHECK-BITFIELD-CONVERSION-NEXT: br label %[[CONT:.*]], !nosanitize59 // CHECK-BITFIELD-CONVERSION: [[CONT]]:60 // CHECK-NEXT: ret void61}