1 // RUN: %clang_cc1 -no-opaque-pointers -std=c++11 -triple x86_64-apple-darwin10 -emit-llvm -o - %s -fsanitize=bool,enum | FileCheck %s 2 3 enum E { 4 a = 1, 5 b = 2, 6 c = 3 7 }; 8 9 struct S { 10 E e1 : 10; 11 }; 12 13 // CHECK-LABEL: define{{.*}} i32 @_Z4loadP1S 14 E load(S *s) { 15 // CHECK: [[LOAD:%.*]] = load i16, i16* {{.*}} 16 // CHECK: [[CLEAR:%.*]] = and i16 [[LOAD]], 1023 17 // CHECK: [[CAST:%.*]] = zext i16 [[CLEAR]] to i32 18 // CHECK: icmp ule i32 [[CAST]], 3, !nosanitize 19 // CHECK: call void @__ubsan_handle_load_invalid_value 20 return s->e1; 21 } 22 23 struct Bool { 24 bool b1 : 1; 25 bool b2 : 7; 26 bool b3 : 16; 27 }; 28 29 // CHECK-LABEL: define{{.*}} zeroext i1 @_Z13load_cpp_boolP4Bool 30 bool load_cpp_bool(Bool *b) { 31 // CHECK-NOT: call void @__ubsan_handle_load_invalid_value 32 // CHECK-NOT: !nosanitize 33 return b->b1 || b->b2 || b->b3; 34 } 35