[clang] Implement lifetime analysis for lifetime_capture_by(X) (#115921)
[llvm-project.git] / clang / test / CodeGenObjC / ubsan-bool.m
blobe33e3e0ef4963396c96047956b1d20986713bf39
1 // RUN: %clang_cc1 -no-enable-noundef-analysis -x objective-c -emit-llvm -triple x86_64-apple-macosx10.10.0 -fsanitize=bool -o - -w < %s | FileCheck %s -check-prefixes=SHARED,OBJC
2 // RUN: %clang_cc1 -no-enable-noundef-analysis -x objective-c++ -emit-llvm -triple x86_64-apple-macosx10.10.0 -fsanitize=bool -o - -w < %s | FileCheck %s -check-prefixes=SHARED,OBJC
3 // RUN: %clang_cc1 -no-enable-noundef-analysis -x c -emit-llvm -triple x86_64-apple-macosx10.10.0 -fsanitize=bool -o - < %s | FileCheck %s -check-prefixes=SHARED,C
5 typedef signed char BOOL;
7 // SHARED-LABEL: define{{.*}}f1
8 BOOL f1(void) {
9   // OBJC: call void @__ubsan_handle_load_invalid_value
10   // C-NOT: call void @__ubsan_handle_load_invalid_value
11   BOOL a = 2;
12   return a + 1;
13   // SHARED: ret i8
16 struct S1 {
17   BOOL b1 : 1;
20 // SHARED-LABEL: define{{.*}}f2
21 BOOL f2(struct S1 *s) {
22   // OBJC: [[LOAD:%.*]] = load i8, ptr {{.*}}
23   // OBJC: [[SHL:%.*]] = shl i8 [[LOAD]], 7
24   // OBJC: [[ASHR:%.*]] = ashr i8 [[SHL]], 7
25   // OBJC: icmp ule i8 [[ASHR]], 1, !nosanitize
26   // OBJC: call void @__ubsan_handle_load_invalid_value
28   // C-NOT: call void @__ubsan_handle_load_invalid_value
29   return s->b1;
30   // SHARED: ret i8
33 #ifdef __OBJC__
34 @interface I1 {
35 @public
36   BOOL b1 : 1;
38 @property (nonatomic) BOOL b1;
39 @end
40 @implementation I1
41 @synthesize b1;
42 @end
44 // Check the synthesized getter.
45 // OBJC-LABEL: define internal signext i8 @"\01-[I1 b1]"
46 // OBJC: [[IVAR:%.*]] = load i64, ptr @"OBJC_IVAR_$_I1.b1"
47 // OBJC: [[ADDR:%.*]] = getelementptr inbounds i8, ptr {{.*}}, i64 [[IVAR]]
48 // OBJC: [[LOAD:%.*]] = load i8, ptr {{.*}}
49 // OBJC: [[SHL:%.*]] = shl i8 [[LOAD]], 7
50 // OBJC: [[ASHR:%.*]] = ashr i8 [[SHL]], 7
51 // OBJC: icmp ule i8 [[ASHR]], 1, !nosanitize
52 // OBJC: call void @__ubsan_handle_load_invalid_value
54 // Also check direct accesses to the ivar.
55 // OBJC-LABEL: define{{.*}}f3
56 BOOL f3(I1 *i) {
57   // OBJC: [[LOAD:%.*]] = load i8, ptr {{.*}}
58   // OBJC: [[SHL:%.*]] = shl i8 [[LOAD]], 7
59   // OBJC: [[ASHR:%.*]] = ashr i8 [[SHL]], 7
60   // OBJC: icmp ule i8 [[ASHR]], 1, !nosanitize
61   // OBJC: call void @__ubsan_handle_load_invalid_value
63   return i->b1;
64   // OBJC: ret i8
66 #endif /* __OBJC__ */