Introduce a new kind of derived-to-base cast which bypasses the need for
null checks, and make sure we elide null checks when accessing base class
members.



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@99963 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/test/CodeGenCXX/member-expressions.cpp b/test/CodeGenCXX/member-expressions.cpp
index 720a9a7..d9fb394 100644
--- a/test/CodeGenCXX/member-expressions.cpp
+++ b/test/CodeGenCXX/member-expressions.cpp
@@ -44,3 +44,43 @@
   return A().foo();
 }
 }
+
+namespace test4 {
+  struct A {
+    int x;
+  };
+  struct B {
+    int x;
+    void foo();
+  };
+  struct C : A, B {
+  };
+
+  extern C *c_ptr;
+
+  // CHECK: define i32 @_ZN5test44testEv()
+  int test() {
+    // CHECK: load {{.*}} @_ZN5test45c_ptrE
+    // CHECK-NEXT: bitcast
+    // CHECK-NEXT: getelementptr
+    // CHECK-NEXT: bitcast
+    // CHECK-NEXT: call void @_ZN5test41B3fooEv
+    c_ptr->B::foo();
+
+    // CHECK: load {{.*}} @_ZN5test45c_ptrE
+    // CHECK-NEXT: bitcast
+    // CHECK-NEXT: getelementptr
+    // CHECK-NEXT: bitcast
+    // CHECK-NEXT: getelementptr
+    // CHECK-NEXT: store i32 5
+    c_ptr->B::x = 5;
+
+    // CHECK: load {{.*}} @_ZN5test45c_ptrE
+    // CHECK-NEXT: bitcast
+    // CHECK-NEXT: getelementptr
+    // CHECK-NEXT: bitcast
+    // CHECK-NEXT: getelementptr
+    // CHECK-NEXT: load i32*
+    return c_ptr->B::x;
+  }
+}