More work on vtable layout. We can now layout vtables with primary bases.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@95965 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/test/CodeGenCXX/vtable-layout.cpp b/test/CodeGenCXX/vtable-layout.cpp
index 3f7e18a..f7db213 100644
--- a/test/CodeGenCXX/vtable-layout.cpp
+++ b/test/CodeGenCXX/vtable-layout.cpp
@@ -9,8 +9,8 @@
 struct A {
   virtual void f();
 };
-
 void A::f() { }
+
 }
 
 namespace Test2 {
@@ -36,10 +36,10 @@
   virtual void h();
   virtual A& operator=(const A&);
 };
-
 void A::f() { }
 
 // Another simple vtable dumper test.
+
 // CHECK:     Vtable for 'Test2::B' (6 entries).
 // CHECK-NEXT:  0 | offset_to_top (0)
 // CHECK-NEXT:  1 | Test2::B RTTI
@@ -48,13 +48,68 @@
 // CHECK-NEXT:  3 | void Test2::B::g() [pure]
 // CHECK-NEXT:  4 | Test2::B::~B() [complete] [pure]
 // CHECK-NEXT:  5 | Test2::B::~B() [deleting] [pure]
-
 struct B {
   virtual void f();
   virtual void g() = 0;
   virtual ~B() = 0;
 };
-
 void B::f() { }
 
 }
+
+namespace Test3 {
+
+// If a function in a derived class overrides a function in a primary base,
+// then the function should not have an entry in the derived class (unless the return
+// value requires adjusting).
+
+// CHECK:      Vtable for 'Test3::A' (3 entries).
+// CHECK-NEXT:   0 | offset_to_top (0)
+// CHECK-NEXT:   1 | Test3::A RTTI
+// CHECK-NEXT:       -- (Test3::A, 0) vtable address --
+// CHECK-NEXT:   2 | void Test3::A::f()
+struct A {
+  virtual void f();
+};
+void A::f() { } 
+
+// CHECK:     Vtable for 'Test3::B' (4 entries).
+// CHECK-NEXT:  0 | offset_to_top (0)
+// CHECK-NEXT:  1 | Test3::B RTTI
+// CHECK-NEXT:      -- (Test3::B, 0) vtable address --
+// CHECK-NEXT:  2 | void Test3::A::f()
+// CHECK-NEXT:  3 | void Test3::B::g()
+struct B : A {
+  virtual void f();
+  virtual void g();
+};
+void B::f() { }
+
+// CHECK:     Vtable for 'Test3::C' (5 entries).
+// CHECK-NEXT:  0 | offset_to_top (0)
+// CHECK-NEXT:  1 | Test3::C RTTI
+// CHECK-NEXT:     -- (Test3::C, 0) vtable address --
+// CHECK-NEXT:  2 | void Test3::A::f()
+// CHECK-NEXT:  3 | void Test3::C::g()
+// CHECK-NEXT:  4 | void Test3::C::h()
+struct C : A {
+  virtual void g();
+  virtual void h();
+};
+void C::g() { }
+
+// CHECK:     Vtable for 'Test3::D' (5 entries).
+// CHECK-NEXT:  0 | offset_to_top (0)
+// CHECK-NEXT:  1 | Test3::D RTTI
+// CHECK-NEXT:     -- (Test3::D, 0) vtable address --
+// CHECK-NEXT:  2 | void Test3::A::f()
+// CHECK-NEXT:  3 | void Test3::B::g()
+// CHECK-NEXT:  4 | void Test3::D::h()
+struct D : B {
+  virtual void f();
+  virtual void g();
+  virtual void h();
+};
+
+void D::f() { } 
+}