94 lines · cpp
1// RUN: %clang -x c++ -fsanitize=implicit-bitfield-conversion -target x86_64-linux -S -emit-llvm -o - %s | FileCheck %s --check-prefixes=CHECK,CHECK-BITFIELD-CONVERSION2// RUN: %clang -x c++ -fsanitize=implicit-integer-conversion -target x86_64-linux -S -emit-llvm -o - %s | FileCheck %s --check-prefixes=CHECK3// RUN: %clang -x c++ -fsanitize=implicit-conversion -target x86_64-linux -S -emit-llvm -o - %s | FileCheck %s --check-prefixes=CHECK,CHECK-BITFIELD-CONVERSION4 5struct S {6 int a:3;7 char b:2;8};9 10class C : public S {11 public:12 short c:3;13};14 15S s;16C c;17 18// CHECK-LABEL: define{{.*}} void @{{.*foo1.*}}19void foo1(int x) {20 s.a = x;21 // CHECK: store i8 %{{.*}}22 // CHECK-BITFIELD-CONVERSION: [[BFRESULTSHL:%.*]] = shl i8 {{.*}}, 523 // CHECK-BITFIELD-CONVERSION-NEXT: [[BFRESULTASHR:%.*]] = ashr i8 [[BFRESULTSHL]], 524 // CHECK-BITFIELD-CONVERSION-NEXT: [[BFRESULTCAST:%.*]] = sext i8 [[BFRESULTASHR]] to i3225 // CHECK-BITFIELD-CONVERSION: call void @__ubsan_handle_implicit_conversion26 // CHECK-BITFIELD-CONVERSION-NEXT: br label %[[CONT:.*]], !nosanitize27 c.a = x;28 // CHECK: store i8 %{{.*}}29 // CHECK-BITFIELD-CONVERSION: [[BFRESULTSHL:%.*]] = shl i8 {{.*}}, 530 // CHECK-BITFIELD-CONVERSION-NEXT: [[BFRESULTASHR:%.*]] = ashr i8 [[BFRESULTSHL]], 531 // CHECK-BITFIELD-CONVERSION-NEXT: [[BFRESULTCAST:%.*]] = sext i8 [[BFRESULTASHR]] to i3232 // CHECK-BITFIELD-CONVERSION: call void @__ubsan_handle_implicit_conversion33 // CHECK-BITFIELD-CONVERSION-NEXT: br label %[[CONT:.*]], !nosanitize34 // CHECK-BITFIELD-CONVERSION: [[CONT]]:35 // CHECK-NEXT: ret void36}37 38// CHECK-LABEL: define{{.*}} void @{{.*foo2.*}}39void foo2(int x) {40 s.b = x;41 // CHECK: store i8 %{{.*}}42 // CHECK-BITFIELD-CONVERSION: [[BFRESULTSHL:%.*]] = shl i8 {{.*}}, 643 // CHECK-BITFIELD-CONVERSION-NEXT: [[BFRESULTASHR:%.*]] = ashr i8 [[BFRESULTSHL]], 644 // CHECK-BITFIELD-CONVERSION: call void @__ubsan_handle_implicit_conversion45 // CHECK-BITFIELD-CONVERSION-NEXT: br label %[[CONT:.*]], !nosanitize46 c.b = x;47 // CHECK: store i8 %{{.*}}48 // CHECK-BITFIELD-CONVERSION: [[BFRESULTSHL:%.*]] = shl i8 {{.*}}, 649 // CHECK-BITFIELD-CONVERSION-NEXT: [[BFRESULTASHR:%.*]] = ashr i8 [[BFRESULTSHL]], 650 // CHECK-BITFIELD-CONVERSION: call void @__ubsan_handle_implicit_conversion51 // CHECK-BITFIELD-CONVERSION-NEXT: br label %[[CONT:.*]], !nosanitize52 // CHECK-BITFIELD-CONVERSION: [[CONT]]:53 // CHECK-NEXT: ret void54}55 56// CHECK-LABEL: define{{.*}} void @{{.*foo3.*}}57void foo3() {58 s.a++;59 // CHECK: store i8 %{{.*}}60 // CHECK-NEXT: [[BFRESULTSHL:%.*]] = shl i8 {{.*}}, 561 // CHECK-NEXT: [[BFRESULTASHR:%.*]] = ashr i8 [[BFRESULTSHL]], 562 // CHECK-NEXT: [[BFRESULTCAST:%.*]] = sext i8 [[BFRESULTASHR]] to i3263 // CHECK-BITFIELD-CONVERSION: call void @__ubsan_handle_implicit_conversion64 // CHECK-BITFIELD-CONVERSION-NEXT: br label %[[CONT:.*]], !nosanitize65 c.a++;66 // CHECK: store i8 %{{.*}}67 // CHECK-NEXT: [[BFRESULTSHL:%.*]] = shl i8 {{.*}}, 568 // CHECK-NEXT: [[BFRESULTASHR:%.*]] = ashr i8 [[BFRESULTSHL]], 569 // CHECK-NEXT: [[BFRESULTCAST:%.*]] = sext i8 [[BFRESULTASHR]] to i3270 // CHECK-BITFIELD-CONVERSION: call void @__ubsan_handle_implicit_conversion71 // CHECK-BITFIELD-CONVERSION-NEXT: br label %[[CONT:.*]], !nosanitize72 // CHECK-BITFIELD-CONVERSION: [[CONT]]:73 // CHECK-NEXT: ret void74}75 76// CHECK-LABEL: define{{.*}} void @{{.*foo4.*}}77void foo4(int x) {78 s.a += x;79 // CHECK: store i8 %{{.*}}80 // CHECK-NEXT: [[BFRESULTSHL:%.*]] = shl i8 {{.*}}, 581 // CHECK-NEXT: [[BFRESULTASHR:%.*]] = ashr i8 [[BFRESULTSHL]], 582 // CHECK-NEXT: [[BFRESULTCAST:%.*]] = sext i8 [[BFRESULTASHR]] to i3283 // CHECK-BITFIELD-CONVERSION: call void @__ubsan_handle_implicit_conversion84 // CHECK-BITFIELD-CONVERSION-NEXT: br label %[[CONT:.*]], !nosanitize85 c.a += x;86 // CHECK: store i8 %{{.*}}87 // CHECK-NEXT: [[BFRESULTSHL:%.*]] = shl i8 {{.*}}, 588 // CHECK-NEXT: [[BFRESULTASHR:%.*]] = ashr i8 [[BFRESULTSHL]], 589 // CHECK-NEXT: [[BFRESULTCAST:%.*]] = sext i8 [[BFRESULTASHR]] to i3290 // CHECK-BITFIELD-CONVERSION: call void @__ubsan_handle_implicit_conversion91 // CHECK-BITFIELD-CONVERSION-NEXT: br label %[[CONT:.*]], !nosanitize92 // CHECK-BITFIELD-CONVERSION: [[CONT]]:93 // CHECK-NEXT: ret void94}