| // RUN: %clang -fsanitize=implicit-bitfield-conversion -target x86_64-linux -S -emit-llvm -o - %s | FileCheck %s --check-prefixes=CHECK,CHECK-BITFIELD-CONVERSION | 
 | // RUN: %clang -fsanitize=implicit-integer-conversion -target x86_64-linux -S -emit-llvm -o - %s | FileCheck %s --check-prefixes=CHECK | 
 | // RUN: %clang -fsanitize=implicit-conversion -target x86_64-linux -S -emit-llvm -o - %s | FileCheck %s --check-prefixes=CHECK,CHECK-BITFIELD-CONVERSION | 
 |  | 
 | typedef struct _xx { | 
 |   int x1:3; | 
 |   char x2:2; | 
 | } xx, *pxx; | 
 |  | 
 | xx vxx; | 
 |  | 
 | // CHECK-LABEL: define{{.*}} void @foo1 | 
 | void foo1(int x) { | 
 |   vxx.x1 = x; | 
 |   // CHECK: store i8 %{{.*}} | 
 |   // CHECK-NEXT: [[BFRESULTSHL:%.*]] = shl i8 {{.*}}, 5 | 
 |   // CHECK-NEXT: [[BFRESULTASHR:%.*]] = ashr i8 [[BFRESULTSHL]], 5 | 
 |   // CHECK-NEXT: [[BFRESULTCAST:%.*]] = sext i8 [[BFRESULTASHR]] to i32 | 
 |   // CHECK-BITFIELD-CONVERSION: call void @__ubsan_handle_implicit_conversion | 
 |   // CHECK-BITFIELD-CONVERSION-NEXT: br label %[[CONT:.*]], !nosanitize | 
 |   // CHECK-BITFIELD-CONVERSION: [[CONT]]: | 
 |   // CHECK-NEXT: ret void | 
 | } | 
 |  | 
 | // CHECK-LABEL: define{{.*}} void @foo2 | 
 | void foo2(int x) { | 
 |   vxx.x2 = x; | 
 |   // CHECK: store i8 %{{.*}} | 
 |   // CHECK-NEXT: [[BFRESULTSHL:%.*]] = shl i8 {{.*}}, 6 | 
 |   // CHECK-NEXT: [[BFRESULTASHR:%.*]] = ashr i8 [[BFRESULTSHL]], 6 | 
 |   // CHECK-BITFIELD-CONVERSION: call void @__ubsan_handle_implicit_conversion | 
 |   // CHECK-BITFIELD-CONVERSION-NEXT: br label %[[CONT:.*]], !nosanitize | 
 |   // CHECK-BITFIELD-CONVERSION: [[CONT]]: | 
 |   // CHECK-NEXT: ret void | 
 | } | 
 |  | 
 | // CHECK-LABEL: define{{.*}} void @foo3 | 
 | void foo3() { | 
 |   vxx.x1++; | 
 |   // CHECK: store i8 %{{.*}} | 
 |   // CHECK-NEXT: [[BFRESULTSHL:%.*]] = shl i8 {{.*}}, 5 | 
 |   // CHECK-NEXT: [[BFRESULTASHR:%.*]] = ashr i8 [[BFRESULTSHL]], 5 | 
 |   // CHECK-NEXT: [[BFRESULTCAST:%.*]] = sext i8 [[BFRESULTASHR]] to i32 | 
 |   // CHECK-BITFIELD-CONVERSION: call void @__ubsan_handle_implicit_conversion | 
 |   // CHECK-BITFIELD-CONVERSION-NEXT: br label %[[CONT:.*]], !nosanitize | 
 |   // CHECK-BITFIELD-CONVERSION: [[CONT]]: | 
 |   // CHECK-NEXT: ret void | 
 | } | 
 |  | 
 | // CHECK-LABEL: define{{.*}} void @foo4 | 
 | void foo4(int x) { | 
 |   vxx.x1 += x; | 
 |   // CHECK: store i8 %{{.*}} | 
 |   // CHECK-NEXT: [[BFRESULTSHL:%.*]] = shl i8 {{.*}}, 5 | 
 |   // CHECK-NEXT: [[BFRESULTASHR:%.*]] = ashr i8 [[BFRESULTSHL]], 5 | 
 |   // CHECK-NEXT: [[BFRESULTCAST:%.*]] = sext i8 [[BFRESULTASHR]] to i32 | 
 |   // CHECK-BITFIELD-CONVERSION: call void @__ubsan_handle_implicit_conversion | 
 |   // CHECK-BITFIELD-CONVERSION-NEXT: br label %[[CONT:.*]], !nosanitize | 
 |   // CHECK-BITFIELD-CONVERSION: [[CONT]]: | 
 |   // CHECK-NEXT: ret void | 
 | } |