summaryrefslogtreecommitdiff
path: root/test/CodeGenCXX/ubsan-nullability-assign.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'test/CodeGenCXX/ubsan-nullability-assign.cpp')
-rw-r--r--test/CodeGenCXX/ubsan-nullability-assign.cpp35
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
+}