| // RUN: %clang_cc1 -x objective-c -emit-llvm -triple x86_64-apple-macosx10.10.0 -fsanitize=nonnull-attribute %s -o - -w | FileCheck %s |
| |
| @interface A |
| |
| -(void) one_arg: (__attribute__((nonnull)) int *) arg1; |
| |
| -(void) varargs: (__attribute__((nonnull)) int *) arg1, ...; |
| |
| +(void) clsmethod: (__attribute__((nonnull)) int *) arg1; |
| |
| @end |
| |
| @implementation A |
| |
| // CHECK-LABEL: define internal void @"\01-[A one_arg:]" |
| // CHECK-SAME: i32* nonnull |
| -(void) one_arg: (__attribute__((nonnull)) int *) arg1 {} |
| |
| // CHECK-LABEL: define internal void @"\01-[A varargs:]" |
| // CHECK-SAME: i32* nonnull |
| -(void) varargs: (__attribute__((nonnull)) int *) arg1, ... {} |
| |
| // CHECK-LABEL: define internal void @"\01+[A clsmethod:]" |
| // CHECK-SAME: i32* nonnull |
| +(void) clsmethod: (__attribute__((nonnull)) int *) arg1 {} |
| |
| @end |
| |
| // CHECK-LABEL: define void @call_A |
| void call_A(A *a, int *p) { |
| // CHECK: [[ICMP:%.*]] = icmp ne i32* [[P1:%.*]], null, !nosanitize |
| // CHECK: br i1 [[ICMP]], {{.*}}, !nosanitize |
| // CHECK: call void @__ubsan_handle_nonnull_arg{{.*}} !nosanitize |
| // CHECK: call void {{.*}} @objc_msgSend {{.*}} ({{.*}}, i32* [[P1]]) |
| [a one_arg: p]; |
| |
| // CHECK: [[ICMP:%.*]] = icmp ne i32* [[P2:%.*]], null, !nosanitize |
| // CHECK: br i1 [[ICMP]], {{.*}}, !nosanitize |
| // CHECK: call void @__ubsan_handle_nonnull_arg{{.*}} !nosanitize |
| // CHECK: call void {{.*}} @objc_msgSend {{.*}} ({{.*}}, i32* [[P2]], {{.*}}) |
| [a varargs: p, p]; |
| |
| // CHECK: [[ICMP:%.*]] = icmp ne i32* [[P3:%.*]], null, !nosanitize |
| // CHECK: br i1 [[ICMP]], {{.*}}, !nosanitize |
| // CHECK: call void @__ubsan_handle_nonnull_arg{{.*}} !nosanitize |
| // CHECK: call void {{.*}} @objc_msgSend {{.*}} ({{.*}}, i32* [[P3]]) |
| [A clsmethod: p]; |
| } |