1// RUN: %clang_cc1 -x objective-c -emit-llvm -triple x86_64-apple-macosx10.10.0 -fsanitize=nonnull-attribute %s -o - -w | FileCheck %s
2
3@interface A
4
5-(void) one_arg: (__attribute__((nonnull)) int *) arg1;
6
7-(void) varargs: (__attribute__((nonnull)) int *) arg1, ...;
8
9+(void) clsmethod: (__attribute__((nonnull)) int *) arg1;
10
11@end
12
13@implementation A
14
15// CHECK-LABEL: define internal void @"\01-[A one_arg:]"
16// CHECK-SAME: i32* nonnull
17-(void) one_arg: (__attribute__((nonnull)) int *) arg1 {}
18
19// CHECK-LABEL: define internal void @"\01-[A varargs:]"
20// CHECK-SAME: i32* nonnull
21-(void) varargs: (__attribute__((nonnull)) int *) arg1, ... {}
22
23// CHECK-LABEL: define internal void @"\01+[A clsmethod:]"
24// CHECK-SAME: i32* nonnull
25+(void) clsmethod: (__attribute__((nonnull)) int *) arg1 {}
26
27@end
28
29// CHECK-LABEL: define void @call_A
30void call_A(A *a, int *p) {
31  // CHECK: [[ICMP:%.*]] = icmp ne i32* [[P1:%.*]], null, !nosanitize
32  // CHECK: br i1 [[ICMP]], {{.*}}, !nosanitize
33  // CHECK: call void @__ubsan_handle_nonnull_arg{{.*}} !nosanitize
34  // CHECK: call void {{.*}} @objc_msgSend {{.*}} ({{.*}}, i32* [[P1]])
35  [a one_arg: p];
36
37  // CHECK: [[ICMP:%.*]] = icmp ne i32* [[P2:%.*]], null, !nosanitize
38  // CHECK: br i1 [[ICMP]], {{.*}}, !nosanitize
39  // CHECK: call void @__ubsan_handle_nonnull_arg{{.*}} !nosanitize
40  // CHECK: call void {{.*}} @objc_msgSend {{.*}} ({{.*}}, i32* [[P2]], {{.*}})
41  [a varargs: p, p];
42
43  // CHECK: [[ICMP:%.*]] = icmp ne i32* [[P3:%.*]], null, !nosanitize
44  // CHECK: br i1 [[ICMP]], {{.*}}, !nosanitize
45  // CHECK: call void @__ubsan_handle_nonnull_arg{{.*}} !nosanitize
46  // CHECK: call void {{.*}} @objc_msgSend {{.*}} ({{.*}}, i32* [[P3]])
47  [A clsmethod: p];
48}
49