diff options
Diffstat (limited to 'test/CodeGenCXX/ubsan-nullability-assign.cpp')
-rw-r--r-- | test/CodeGenCXX/ubsan-nullability-assign.cpp | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/test/CodeGenCXX/ubsan-nullability-assign.cpp b/test/CodeGenCXX/ubsan-nullability-assign.cpp new file mode 100644 index 0000000000000..3f85c88d6e760 --- /dev/null +++ b/test/CodeGenCXX/ubsan-nullability-assign.cpp @@ -0,0 +1,35 @@ +// RUN: %clang_cc1 -x c++ -triple x86_64-apple-darwin10 -emit-llvm -o - %s -fsanitize=nullability-assign | FileCheck %s + +struct S1 { + int *_Nonnull p; +}; + +struct S2 { + S1 s1; +}; + +union U1 { + S1 s1; + S2 s2; +}; + +// CHECK-LABEL: define void @{{.*}}f1 +void f1(int *p) { + U1 u; + + // CHECK: [[ICMP:%.*]] = icmp ne i32* {{.*}}, null, !nosanitize + // CHECK-NEXT: br i1 [[ICMP]], {{.*}}, !nosanitize + // CHECK: call void @__ubsan_handle_type_mismatch{{.*}} !nosanitize + // CHECK: store + u.s1.p = p; + + // CHECK: [[ICMP:%.*]] = icmp ne i32* {{.*}}, null, !nosanitize + // CHECK-NEXT: br i1 [[ICMP]], {{.*}}, !nosanitize + // CHECK: call void @__ubsan_handle_type_mismatch{{.*}} !nosanitize + // CHECK: store + u.s2.s1.p = p; + + // CHECK-NOT: __ubsan_handle_type_mismatch + // CHECK-NOT: store + // CHECK: ret void +} |