annotate clang/test/CodeGenObjC/ubsan-nullability.m @ 252:1f2b6ac9f198 llvm-original

LLVM16-1
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Fri, 18 Aug 2023 09:04:13 +0900
parents c4bab56944e8
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
150
anatofuz
parents:
diff changeset
1 // REQUIRES: asserts
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
2 // RUN: %clang_cc1 -no-enable-noundef-analysis -x objective-c -emit-llvm -triple x86_64-apple-macosx10.10.0 -fblocks -fobjc-arc -fsanitize=nullability-arg,nullability-assign,nullability-return -w %s -o - | FileCheck %s
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
3 // RUN: %clang_cc1 -no-enable-noundef-analysis -x objective-c++ -emit-llvm -triple x86_64-apple-macosx10.10.0 -fblocks -fobjc-arc -fsanitize=nullability-arg,nullability-assign,nullability-return -w %s -o - | FileCheck %s
150
anatofuz
parents:
diff changeset
4
anatofuz
parents:
diff changeset
5 // CHECK: [[NONNULL_RV_LOC1:@.*]] = private unnamed_addr global {{.*}} i32 100, i32 6
anatofuz
parents:
diff changeset
6 // CHECK: [[NONNULL_ARG_LOC:@.*]] = private unnamed_addr global {{.*}} i32 204, i32 15 {{.*}} i32 190, i32 23
anatofuz
parents:
diff changeset
7 // CHECK: [[NONNULL_ASSIGN1_LOC:@.*]] = private unnamed_addr global {{.*}} i32 305, i32 9
anatofuz
parents:
diff changeset
8 // CHECK: [[NONNULL_ASSIGN2_LOC:@.*]] = private unnamed_addr global {{.*}} i32 405, i32 10
anatofuz
parents:
diff changeset
9 // CHECK: [[NONNULL_ASSIGN3_LOC:@.*]] = private unnamed_addr global {{.*}} i32 506, i32 10
anatofuz
parents:
diff changeset
10 // CHECK: [[NONNULL_INIT1_LOC:@.*]] = private unnamed_addr global {{.*}} i32 604, i32 25
anatofuz
parents:
diff changeset
11 // CHECK: [[NONNULL_INIT2_LOC1:@.*]] = private unnamed_addr global {{.*}} i32 707, i32 26
anatofuz
parents:
diff changeset
12 // CHECK: [[NONNULL_INIT2_LOC2:@.*]] = private unnamed_addr global {{.*}} i32 707, i32 29
anatofuz
parents:
diff changeset
13 // CHECK: [[NONNULL_RV_LOC2:@.*]] = private unnamed_addr global {{.*}} i32 800, i32 6
anatofuz
parents:
diff changeset
14
anatofuz
parents:
diff changeset
15 #define NULL ((void *)0)
anatofuz
parents:
diff changeset
16 #define INULL ((int *)NULL)
anatofuz
parents:
diff changeset
17 #define INNULL ((int *_Nonnull)NULL)
anatofuz
parents:
diff changeset
18
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
19 // CHECK-LABEL: define{{.*}} ptr @{{.*}}nonnull_retval1
150
anatofuz
parents:
diff changeset
20 #line 100
anatofuz
parents:
diff changeset
21 int *_Nonnull nonnull_retval1(int *p) {
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
22 // CHECK: nullcheck:
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
23 // CHECK: [[ICMP:%.*]] = icmp ne ptr {{.*}}, null, !nosanitize
150
anatofuz
parents:
diff changeset
24 // CHECK: br i1 [[ICMP]], {{.*}}, !nosanitize
anatofuz
parents:
diff changeset
25 // CHECK: call void @__ubsan_handle_nullability_return{{.*}}[[NONNULL_RV_LOC1]]
anatofuz
parents:
diff changeset
26 return p;
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
27 // CHECK: ret ptr
150
anatofuz
parents:
diff changeset
28 }
anatofuz
parents:
diff changeset
29
anatofuz
parents:
diff changeset
30 #line 190
anatofuz
parents:
diff changeset
31 void nonnull_arg(int *_Nonnull p) {}
anatofuz
parents:
diff changeset
32
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
33 // CHECK-LABEL: define{{.*}} void @{{.*}}call_func_with_nonnull_arg
150
anatofuz
parents:
diff changeset
34 #line 200
anatofuz
parents:
diff changeset
35 void call_func_with_nonnull_arg(int *_Nonnull p) {
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
36 // CHECK: [[ICMP:%.*]] = icmp ne ptr {{.*}}, null, !nosanitize
150
anatofuz
parents:
diff changeset
37 // CHECK-NEXT: br i1 [[ICMP]], {{.*}}, !nosanitize
anatofuz
parents:
diff changeset
38 // CHECK: call void @__ubsan_handle_nullability_arg{{.*}}[[NONNULL_ARG_LOC]]
anatofuz
parents:
diff changeset
39 nonnull_arg(p);
anatofuz
parents:
diff changeset
40 }
anatofuz
parents:
diff changeset
41
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
42 // CHECK-LABEL: define{{.*}} void @{{.*}}nonnull_assign1
150
anatofuz
parents:
diff changeset
43 #line 300
anatofuz
parents:
diff changeset
44 void nonnull_assign1(int *p) {
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
45 // CHECK: [[ICMP:%.*]] = icmp ne ptr {{.*}}, null, !nosanitize
150
anatofuz
parents:
diff changeset
46 // CHECK-NEXT: br i1 [[ICMP]], {{.*}}, !nosanitize
anatofuz
parents:
diff changeset
47 // CHECK: call void @__ubsan_handle_type_mismatch{{.*}}[[NONNULL_ASSIGN1_LOC]]
anatofuz
parents:
diff changeset
48 int *_Nonnull local;
anatofuz
parents:
diff changeset
49 local = p;
anatofuz
parents:
diff changeset
50 }
anatofuz
parents:
diff changeset
51
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
52 // CHECK-LABEL: define{{.*}} void @{{.*}}nonnull_assign2
150
anatofuz
parents:
diff changeset
53 #line 400
anatofuz
parents:
diff changeset
54 void nonnull_assign2(int *p) {
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
55 // CHECK: [[ICMP:%.*]] = icmp ne ptr %{{.*}}, null, !nosanitize
150
anatofuz
parents:
diff changeset
56 // CHECK-NEXT: br i1 [[ICMP]], {{.*}}, !nosanitize
anatofuz
parents:
diff changeset
57 // CHECK: call void @__ubsan_handle_type_mismatch{{.*}}[[NONNULL_ASSIGN2_LOC]]
anatofuz
parents:
diff changeset
58 int *_Nonnull arr[1];
anatofuz
parents:
diff changeset
59 arr[0] = p;
anatofuz
parents:
diff changeset
60 }
anatofuz
parents:
diff changeset
61
anatofuz
parents:
diff changeset
62 struct S1 {
anatofuz
parents:
diff changeset
63 int *_Nonnull mptr;
anatofuz
parents:
diff changeset
64 };
anatofuz
parents:
diff changeset
65
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
66 // CHECK-LABEL: define{{.*}} void @{{.*}}nonnull_assign3
150
anatofuz
parents:
diff changeset
67 #line 500
anatofuz
parents:
diff changeset
68 void nonnull_assign3(int *p) {
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
69 // CHECK: [[ICMP:%.*]] = icmp ne ptr %{{.*}}, null, !nosanitize
150
anatofuz
parents:
diff changeset
70 // CHECK-NEXT: br i1 [[ICMP]], {{.*}}, !nosanitize
anatofuz
parents:
diff changeset
71 // CHECK: call void @__ubsan_handle_type_mismatch{{.*}}[[NONNULL_ASSIGN3_LOC]]
anatofuz
parents:
diff changeset
72 // CHECK-NOT: call void @__ubsan_handle_type_mismatch
anatofuz
parents:
diff changeset
73 struct S1 s;
anatofuz
parents:
diff changeset
74 s.mptr = p;
anatofuz
parents:
diff changeset
75 }
anatofuz
parents:
diff changeset
76
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
77 // CHECK-LABEL: define{{.*}} void @{{.*}}nonnull_init1
150
anatofuz
parents:
diff changeset
78 #line 600
anatofuz
parents:
diff changeset
79 void nonnull_init1(int *p) {
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
80 // CHECK: [[ICMP:%.*]] = icmp ne ptr %{{.*}}, null, !nosanitize
150
anatofuz
parents:
diff changeset
81 // CHECK-NEXT: br i1 [[ICMP]], {{.*}}, !nosanitize
anatofuz
parents:
diff changeset
82 // CHECK: call void @__ubsan_handle_type_mismatch{{.*}}[[NONNULL_INIT1_LOC]]
anatofuz
parents:
diff changeset
83 int *_Nonnull local = p;
anatofuz
parents:
diff changeset
84 }
anatofuz
parents:
diff changeset
85
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
86 // CHECK-LABEL: define{{.*}} void @{{.*}}nonnull_init2
150
anatofuz
parents:
diff changeset
87 #line 700
anatofuz
parents:
diff changeset
88 void nonnull_init2(int *p) {
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
89 // CHECK: [[ICMP:%.*]] = icmp ne ptr %{{.*}}, null, !nosanitize
150
anatofuz
parents:
diff changeset
90 // CHECK-NEXT: br i1 [[ICMP]], {{.*}}, !nosanitize
anatofuz
parents:
diff changeset
91 // CHECK: call void @__ubsan_handle_type_mismatch{{.*}}[[NONNULL_INIT2_LOC1]]
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
92 // CHECK: [[ICMP:%.*]] = icmp ne ptr %{{.*}}, null, !nosanitize
150
anatofuz
parents:
diff changeset
93 // CHECK-NEXT: br i1 [[ICMP]], {{.*}}, !nosanitize
anatofuz
parents:
diff changeset
94 // CHECK: call void @__ubsan_handle_type_mismatch{{.*}}[[NONNULL_INIT2_LOC2]]
anatofuz
parents:
diff changeset
95 int *_Nonnull arr[] = {p, p};
anatofuz
parents:
diff changeset
96 }
anatofuz
parents:
diff changeset
97
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
98 // CHECK-LABEL: define{{.*}} ptr @{{.*}}nonnull_retval2
150
anatofuz
parents:
diff changeset
99 #line 800
anatofuz
parents:
diff changeset
100 int *_Nonnull nonnull_retval2(int *_Nonnull arg1, //< Test this.
anatofuz
parents:
diff changeset
101 int *_Nonnull arg2, //< Test this.
anatofuz
parents:
diff changeset
102 int *_Nullable arg3, //< Don't test the rest.
anatofuz
parents:
diff changeset
103 int *arg4,
anatofuz
parents:
diff changeset
104 int arg5, ...) {
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
105 // CHECK: [[ARG1CMP:%.*]] = icmp ne ptr %arg1, null, !nosanitize
150
anatofuz
parents:
diff changeset
106 // CHECK-NEXT: [[DO_RV_CHECK_1:%.*]] = and i1 true, [[ARG1CMP]], !nosanitize
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
107 // CHECK: [[ARG2CMP:%.*]] = icmp ne ptr %arg2, null, !nosanitize
150
anatofuz
parents:
diff changeset
108 // CHECK-NEXT: [[DO_RV_CHECK_2:%.*]] = and i1 [[DO_RV_CHECK_1]], [[ARG2CMP]]
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
109 // CHECK: [[SLOC_PTR:%.*]] = load ptr, ptr %return.sloc.ptr
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
110 // CHECK-NEXT: [[SLOC_NONNULL:%.*]] = icmp ne ptr [[SLOC_PTR]], null
150
anatofuz
parents:
diff changeset
111 // CHECK-NEXT: [[DO_RV_CHECK_3:%.*]] = and i1 [[SLOC_NONNULL]], [[DO_RV_CHECK_2]]
anatofuz
parents:
diff changeset
112 // CHECK: br i1 [[DO_RV_CHECK_3]], label %[[NULL:.*]], label %[[NONULL:.*]], !nosanitize
anatofuz
parents:
diff changeset
113 // CHECK: [[NULL]]:
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
114 // CHECK-NEXT: [[ICMP:%.*]] = icmp ne ptr {{.*}}, null, !nosanitize
150
anatofuz
parents:
diff changeset
115 // CHECK: br i1 [[ICMP]], {{.*}}, !nosanitize
anatofuz
parents:
diff changeset
116 // CHECK: call void @__ubsan_handle_nullability_return{{.*}}[[NONNULL_RV_LOC2]]
anatofuz
parents:
diff changeset
117 return arg1;
anatofuz
parents:
diff changeset
118 // CHECK: [[NONULL]]:
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
119 // CHECK-NEXT: ret ptr
150
anatofuz
parents:
diff changeset
120 }
anatofuz
parents:
diff changeset
121
anatofuz
parents:
diff changeset
122 @interface A
anatofuz
parents:
diff changeset
123 +(int *_Nonnull) objc_clsmethod: (int *_Nonnull) arg1;
anatofuz
parents:
diff changeset
124 -(int *_Nonnull) objc_method: (int *_Nonnull) arg1;
anatofuz
parents:
diff changeset
125 @end
anatofuz
parents:
diff changeset
126
anatofuz
parents:
diff changeset
127 @implementation A
anatofuz
parents:
diff changeset
128
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
129 // CHECK-LABEL: define internal ptr @"\01+[A objc_clsmethod:]"
150
anatofuz
parents:
diff changeset
130 +(int *_Nonnull) objc_clsmethod: (int *_Nonnull) arg1 {
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
131 // CHECK: [[ARG1CMP:%.*]] = icmp ne ptr %arg1, null, !nosanitize
150
anatofuz
parents:
diff changeset
132 // CHECK-NEXT: [[DO_RV_CHECK:%.*]] = and i1 true, [[ARG1CMP]]
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
133 // CHECK: [[SLOC_PTR:%.*]] = load ptr, ptr %return.sloc.ptr
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
134 // CHECK-NEXT: [[SLOC_NONNULL:%.*]] = icmp ne ptr [[SLOC_PTR]], null
150
anatofuz
parents:
diff changeset
135 // CHECK-NEXT: [[DO_RV_CHECK_2:%.*]] = and i1 [[SLOC_NONNULL]], [[DO_RV_CHECK]]
anatofuz
parents:
diff changeset
136 // CHECK: br i1 [[DO_RV_CHECK_2]], label %[[NULL:.*]], label %[[NONULL:.*]], !nosanitize
anatofuz
parents:
diff changeset
137 // CHECK: [[NULL]]:
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
138 // CHECK-NEXT: [[ICMP:%.*]] = icmp ne ptr {{.*}}, null, !nosanitize
150
anatofuz
parents:
diff changeset
139 // CHECK: br i1 [[ICMP]], {{.*}}, !nosanitize
anatofuz
parents:
diff changeset
140 // CHECK: call void @__ubsan_handle_nullability_return{{.*}}
anatofuz
parents:
diff changeset
141 return arg1;
anatofuz
parents:
diff changeset
142 // CHECK: [[NONULL]]:
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
143 // CHECK-NEXT: ret ptr
150
anatofuz
parents:
diff changeset
144 }
anatofuz
parents:
diff changeset
145
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
146 // CHECK-LABEL: define internal ptr @"\01-[A objc_method:]"
150
anatofuz
parents:
diff changeset
147 -(int *_Nonnull) objc_method: (int *_Nonnull) arg1 {
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
148 // CHECK: [[ARG1CMP:%.*]] = icmp ne ptr %arg1, null, !nosanitize
150
anatofuz
parents:
diff changeset
149 // CHECK-NEXT: [[DO_RV_CHECK:%.*]] = and i1 true, [[ARG1CMP]]
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
150 // CHECK: [[SLOC_PTR:%.*]] = load ptr, ptr %return.sloc.ptr
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
151 // CHECK-NEXT: [[SLOC_NONNULL:%.*]] = icmp ne ptr [[SLOC_PTR]], null
150
anatofuz
parents:
diff changeset
152 // CHECK-NEXT: [[DO_RV_CHECK_2:%.*]] = and i1 [[SLOC_NONNULL]], [[DO_RV_CHECK]]
anatofuz
parents:
diff changeset
153 // CHECK: br i1 [[DO_RV_CHECK_2]], label %[[NULL:.*]], label %[[NONULL:.*]], !nosanitize
anatofuz
parents:
diff changeset
154 // CHECK: [[NULL]]:
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
155 // CHECK-NEXT: [[ICMP:%.*]] = icmp ne ptr {{.*}}, null, !nosanitize
150
anatofuz
parents:
diff changeset
156 // CHECK: br i1 [[ICMP]], {{.*}}, !nosanitize
anatofuz
parents:
diff changeset
157 // CHECK: call void @__ubsan_handle_nullability_return{{.*}}
anatofuz
parents:
diff changeset
158 return arg1;
anatofuz
parents:
diff changeset
159 // CHECK: [[NONULL]]:
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
160 // CHECK-NEXT: ret ptr
150
anatofuz
parents:
diff changeset
161 }
anatofuz
parents:
diff changeset
162 @end
anatofuz
parents:
diff changeset
163
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
164 // CHECK-LABEL: define{{.*}} void @{{.*}}call_A
150
anatofuz
parents:
diff changeset
165 void call_A(A *a, int *p) {
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
166 // CHECK: [[ICMP:%.*]] = icmp ne ptr [[P1:%.*]], null, !nosanitize
150
anatofuz
parents:
diff changeset
167 // CHECK-NEXT: br i1 [[ICMP]], {{.*}}, !nosanitize
anatofuz
parents:
diff changeset
168 // CHECK: call void @__ubsan_handle_nullability_arg{{.*}} !nosanitize
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
169 // CHECK: call ptr @objc_msgSend({{.*}}, ptr [[P1]])
150
anatofuz
parents:
diff changeset
170 [a objc_method: p];
anatofuz
parents:
diff changeset
171
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
172 // CHECK: [[ICMP:%.*]] = icmp ne ptr [[P2:%.*]], null, !nosanitize
150
anatofuz
parents:
diff changeset
173 // CHECK-NEXT: br i1 [[ICMP]], {{.*}}, !nosanitize
anatofuz
parents:
diff changeset
174 // CHECK: call void @__ubsan_handle_nullability_arg{{.*}} !nosanitize
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
175 // CHECK: call ptr @objc_msgSend({{.*}}, ptr [[P2]])
150
anatofuz
parents:
diff changeset
176 [A objc_clsmethod: p];
anatofuz
parents:
diff changeset
177 }
anatofuz
parents:
diff changeset
178
anatofuz
parents:
diff changeset
179 void dont_crash(int *_Nonnull p, ...) {}
anatofuz
parents:
diff changeset
180
anatofuz
parents:
diff changeset
181 @protocol NSObject
anatofuz
parents:
diff changeset
182 - (id)init;
anatofuz
parents:
diff changeset
183 @end
anatofuz
parents:
diff changeset
184 @interface NSObject <NSObject> {}
anatofuz
parents:
diff changeset
185 @end
anatofuz
parents:
diff changeset
186
anatofuz
parents:
diff changeset
187 #pragma clang assume_nonnull begin
anatofuz
parents:
diff changeset
188
anatofuz
parents:
diff changeset
189 /// Create a "NSObject * _Nonnull" instance.
236
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
190 NSObject *get_nonnull_error(void) {
150
anatofuz
parents:
diff changeset
191 // Use nil for convenience. The actual object doesn't matter.
anatofuz
parents:
diff changeset
192 return (NSObject *)NULL;
anatofuz
parents:
diff changeset
193 }
anatofuz
parents:
diff changeset
194
anatofuz
parents:
diff changeset
195 NSObject *_Nullable no_null_return_value_diagnostic(int flag) {
anatofuz
parents:
diff changeset
196 // CHECK-LABEL: define internal {{.*}}no_null_return_value_diagnostic{{i?}}_block_invoke
anatofuz
parents:
diff changeset
197 // CHECK-NOT: @__ubsan_handle_nullability_return
236
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
198 NSObject *_Nullable (^foo)(void) = ^(void) {
150
anatofuz
parents:
diff changeset
199 if (flag) {
anatofuz
parents:
diff changeset
200 // Clang should not infer a nonnull return value for this block when this
anatofuz
parents:
diff changeset
201 // call is present.
anatofuz
parents:
diff changeset
202 return get_nonnull_error();
anatofuz
parents:
diff changeset
203 } else {
anatofuz
parents:
diff changeset
204 return (NSObject *)NULL;
anatofuz
parents:
diff changeset
205 }
anatofuz
parents:
diff changeset
206 };
anatofuz
parents:
diff changeset
207 return foo();
anatofuz
parents:
diff changeset
208 }
anatofuz
parents:
diff changeset
209
anatofuz
parents:
diff changeset
210 #pragma clang assume_nonnull end
anatofuz
parents:
diff changeset
211
236
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
212 int main(void) {
150
anatofuz
parents:
diff changeset
213 nonnull_retval1(INULL);
anatofuz
parents:
diff changeset
214 nonnull_retval2(INNULL, INNULL, INULL, (int *_Nullable)NULL, 0, 0, 0, 0);
anatofuz
parents:
diff changeset
215 call_func_with_nonnull_arg(INNULL);
anatofuz
parents:
diff changeset
216 nonnull_assign1(INULL);
anatofuz
parents:
diff changeset
217 nonnull_assign2(INULL);
anatofuz
parents:
diff changeset
218 nonnull_assign3(INULL);
anatofuz
parents:
diff changeset
219 nonnull_init1(INULL);
anatofuz
parents:
diff changeset
220 nonnull_init2(INULL);
anatofuz
parents:
diff changeset
221 call_A((A *)NULL, INULL);
anatofuz
parents:
diff changeset
222 dont_crash(INNULL, NULL);
anatofuz
parents:
diff changeset
223 no_null_return_value_diagnostic(0);
anatofuz
parents:
diff changeset
224 no_null_return_value_diagnostic(1);
anatofuz
parents:
diff changeset
225 return 0;
anatofuz
parents:
diff changeset
226 }