xref: /llvm-project/clang/test/CodeGenCXX/ubsan-bitfield-conversion.cpp (revision 3009228a09dbfe04e0911fc19813ec72d389bc45)
1708c8cd7SAxel Lundberg // RUN: %clang -x c++ -fsanitize=implicit-bitfield-conversion -target x86_64-linux -S -emit-llvm -o - %s | FileCheck %s --check-prefixes=CHECK,CHECK-BITFIELD-CONVERSION
2708c8cd7SAxel Lundberg // RUN: %clang -x c++ -fsanitize=implicit-integer-conversion -target x86_64-linux -S -emit-llvm -o - %s | FileCheck %s --check-prefixes=CHECK
3708c8cd7SAxel Lundberg // RUN: %clang -x c++ -fsanitize=implicit-conversion -target x86_64-linux -S -emit-llvm -o - %s | FileCheck %s --check-prefixes=CHECK,CHECK-BITFIELD-CONVERSION
4708c8cd7SAxel Lundberg 
5708c8cd7SAxel Lundberg struct S {
6708c8cd7SAxel Lundberg   int a:3;
7708c8cd7SAxel Lundberg   char b:2;
8708c8cd7SAxel Lundberg };
9708c8cd7SAxel Lundberg 
10708c8cd7SAxel Lundberg class C : public S {
11708c8cd7SAxel Lundberg   public:
12708c8cd7SAxel Lundberg     short c:3;
13708c8cd7SAxel Lundberg };
14708c8cd7SAxel Lundberg 
15708c8cd7SAxel Lundberg S s;
16708c8cd7SAxel Lundberg C c;
17708c8cd7SAxel Lundberg 
18708c8cd7SAxel Lundberg // CHECK-LABEL: define{{.*}} void @{{.*foo1.*}}
foo1(int x)19708c8cd7SAxel Lundberg void foo1(int x) {
20708c8cd7SAxel Lundberg   s.a = x;
21708c8cd7SAxel Lundberg   // CHECK: store i8 %{{.*}}
22708c8cd7SAxel Lundberg   // CHECK-BITFIELD-CONVERSION: [[BFRESULTSHL:%.*]] = shl i8 {{.*}}, 5
23708c8cd7SAxel Lundberg   // CHECK-BITFIELD-CONVERSION-NEXT: [[BFRESULTASHR:%.*]] = ashr i8 [[BFRESULTSHL]], 5
24708c8cd7SAxel Lundberg   // CHECK-BITFIELD-CONVERSION-NEXT: [[BFRESULTCAST:%.*]] = sext i8 [[BFRESULTASHR]] to i32
25708c8cd7SAxel Lundberg   // CHECK-BITFIELD-CONVERSION: call void @__ubsan_handle_implicit_conversion
26*3009228aSMichael Halkenhäuser   // CHECK-BITFIELD-CONVERSION-NEXT: br label %[[CONT:.*]], !nosanitize
27708c8cd7SAxel Lundberg   c.a = x;
28708c8cd7SAxel Lundberg   // CHECK: store i8 %{{.*}}
29708c8cd7SAxel Lundberg   // CHECK-BITFIELD-CONVERSION: [[BFRESULTSHL:%.*]] = shl i8 {{.*}}, 5
30708c8cd7SAxel Lundberg   // CHECK-BITFIELD-CONVERSION-NEXT: [[BFRESULTASHR:%.*]] = ashr i8 [[BFRESULTSHL]], 5
31708c8cd7SAxel Lundberg   // CHECK-BITFIELD-CONVERSION-NEXT: [[BFRESULTCAST:%.*]] = sext i8 [[BFRESULTASHR]] to i32
32708c8cd7SAxel Lundberg   // CHECK-BITFIELD-CONVERSION: call void @__ubsan_handle_implicit_conversion
33*3009228aSMichael Halkenhäuser   // CHECK-BITFIELD-CONVERSION-NEXT: br label %[[CONT:.*]], !nosanitize
34708c8cd7SAxel Lundberg   // CHECK-BITFIELD-CONVERSION: [[CONT]]:
35708c8cd7SAxel Lundberg   // CHECK-NEXT: ret void
36708c8cd7SAxel Lundberg }
37708c8cd7SAxel Lundberg 
38708c8cd7SAxel Lundberg // CHECK-LABEL: define{{.*}} void @{{.*foo2.*}}
foo2(int x)39708c8cd7SAxel Lundberg void foo2(int x) {
40708c8cd7SAxel Lundberg   s.b = x;
41708c8cd7SAxel Lundberg   // CHECK: store i8 %{{.*}}
42708c8cd7SAxel Lundberg   // CHECK-BITFIELD-CONVERSION: [[BFRESULTSHL:%.*]] = shl i8 {{.*}}, 6
43708c8cd7SAxel Lundberg   // CHECK-BITFIELD-CONVERSION-NEXT: [[BFRESULTASHR:%.*]] = ashr i8 [[BFRESULTSHL]], 6
44708c8cd7SAxel Lundberg   // CHECK-BITFIELD-CONVERSION: call void @__ubsan_handle_implicit_conversion
45*3009228aSMichael Halkenhäuser   // CHECK-BITFIELD-CONVERSION-NEXT: br label %[[CONT:.*]], !nosanitize
46708c8cd7SAxel Lundberg   c.b = x;
47708c8cd7SAxel Lundberg   // CHECK: store i8 %{{.*}}
48708c8cd7SAxel Lundberg   // CHECK-BITFIELD-CONVERSION: [[BFRESULTSHL:%.*]] = shl i8 {{.*}}, 6
49708c8cd7SAxel Lundberg   // CHECK-BITFIELD-CONVERSION-NEXT: [[BFRESULTASHR:%.*]] = ashr i8 [[BFRESULTSHL]], 6
50708c8cd7SAxel Lundberg   // CHECK-BITFIELD-CONVERSION: call void @__ubsan_handle_implicit_conversion
51*3009228aSMichael Halkenhäuser   // CHECK-BITFIELD-CONVERSION-NEXT: br label %[[CONT:.*]], !nosanitize
52708c8cd7SAxel Lundberg   // CHECK-BITFIELD-CONVERSION: [[CONT]]:
53708c8cd7SAxel Lundberg   // CHECK-NEXT: ret void
54708c8cd7SAxel Lundberg }
55708c8cd7SAxel Lundberg 
56708c8cd7SAxel Lundberg // CHECK-LABEL: define{{.*}} void @{{.*foo3.*}}
foo3()57708c8cd7SAxel Lundberg void foo3() {
58708c8cd7SAxel Lundberg   s.a++;
59708c8cd7SAxel Lundberg   // CHECK: store i8 %{{.*}}
60708c8cd7SAxel Lundberg   // CHECK-NEXT: [[BFRESULTSHL:%.*]] = shl i8 {{.*}}, 5
61708c8cd7SAxel Lundberg   // CHECK-NEXT: [[BFRESULTASHR:%.*]] = ashr i8 [[BFRESULTSHL]], 5
62708c8cd7SAxel Lundberg   // CHECK-NEXT: [[BFRESULTCAST:%.*]] = sext i8 [[BFRESULTASHR]] to i32
63708c8cd7SAxel Lundberg   // CHECK-BITFIELD-CONVERSION: call void @__ubsan_handle_implicit_conversion
64*3009228aSMichael Halkenhäuser   // CHECK-BITFIELD-CONVERSION-NEXT: br label %[[CONT:.*]], !nosanitize
65708c8cd7SAxel Lundberg   c.a++;
66708c8cd7SAxel Lundberg   // CHECK: store i8 %{{.*}}
67708c8cd7SAxel Lundberg   // CHECK-NEXT: [[BFRESULTSHL:%.*]] = shl i8 {{.*}}, 5
68708c8cd7SAxel Lundberg   // CHECK-NEXT: [[BFRESULTASHR:%.*]] = ashr i8 [[BFRESULTSHL]], 5
69708c8cd7SAxel Lundberg   // CHECK-NEXT: [[BFRESULTCAST:%.*]] = sext i8 [[BFRESULTASHR]] to i32
70708c8cd7SAxel Lundberg   // CHECK-BITFIELD-CONVERSION: call void @__ubsan_handle_implicit_conversion
71*3009228aSMichael Halkenhäuser   // CHECK-BITFIELD-CONVERSION-NEXT: br label %[[CONT:.*]], !nosanitize
72708c8cd7SAxel Lundberg   // CHECK-BITFIELD-CONVERSION: [[CONT]]:
73708c8cd7SAxel Lundberg   // CHECK-NEXT: ret void
74708c8cd7SAxel Lundberg }
75708c8cd7SAxel Lundberg 
76708c8cd7SAxel Lundberg // CHECK-LABEL: define{{.*}} void @{{.*foo4.*}}
foo4(int x)77708c8cd7SAxel Lundberg void foo4(int x) {
78708c8cd7SAxel Lundberg   s.a += x;
79708c8cd7SAxel Lundberg   // CHECK: store i8 %{{.*}}
80708c8cd7SAxel Lundberg   // CHECK-NEXT: [[BFRESULTSHL:%.*]] = shl i8 {{.*}}, 5
81708c8cd7SAxel Lundberg   // CHECK-NEXT: [[BFRESULTASHR:%.*]] = ashr i8 [[BFRESULTSHL]], 5
82708c8cd7SAxel Lundberg   // CHECK-NEXT: [[BFRESULTCAST:%.*]] = sext i8 [[BFRESULTASHR]] to i32
83708c8cd7SAxel Lundberg   // CHECK-BITFIELD-CONVERSION: call void @__ubsan_handle_implicit_conversion
84*3009228aSMichael Halkenhäuser   // CHECK-BITFIELD-CONVERSION-NEXT: br label %[[CONT:.*]], !nosanitize
85708c8cd7SAxel Lundberg   c.a += x;
86708c8cd7SAxel Lundberg   // CHECK: store i8 %{{.*}}
87708c8cd7SAxel Lundberg   // CHECK-NEXT: [[BFRESULTSHL:%.*]] = shl i8 {{.*}}, 5
88708c8cd7SAxel Lundberg   // CHECK-NEXT: [[BFRESULTASHR:%.*]] = ashr i8 [[BFRESULTSHL]], 5
89708c8cd7SAxel Lundberg   // CHECK-NEXT: [[BFRESULTCAST:%.*]] = sext i8 [[BFRESULTASHR]] to i32
90708c8cd7SAxel Lundberg   // CHECK-BITFIELD-CONVERSION: call void @__ubsan_handle_implicit_conversion
91*3009228aSMichael Halkenhäuser   // CHECK-BITFIELD-CONVERSION-NEXT: br label %[[CONT:.*]], !nosanitize
92708c8cd7SAxel Lundberg   // CHECK-BITFIELD-CONVERSION: [[CONT]]:
93708c8cd7SAxel Lundberg   // CHECK-NEXT: ret void
94708c8cd7SAxel Lundberg }