[cfe-commits] r100952 - in /cfe/trunk: lib/AST/RecordLayoutBuilder.cpp test/CodeGenCXX/vtable-layout.cpp

Anders Carlsson andersca at mac.com
Sat Apr 10 14:35:33 PDT 2010


Author: andersca
Date: Sat Apr 10 16:35:33 2010
New Revision: 100952

URL: http://llvm.org/viewvc/llvm-project?rev=100952&view=rev
Log:
Fix another vbase layout bug.

Modified:
    cfe/trunk/lib/AST/RecordLayoutBuilder.cpp
    cfe/trunk/test/CodeGenCXX/vtable-layout.cpp

Modified: cfe/trunk/lib/AST/RecordLayoutBuilder.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/RecordLayoutBuilder.cpp?rev=100952&r1=100951&r2=100952&view=diff
==============================================================================
--- cfe/trunk/lib/AST/RecordLayoutBuilder.cpp (original)
+++ cfe/trunk/lib/AST/RecordLayoutBuilder.cpp Sat Apr 10 16:35:33 2010
@@ -263,8 +263,12 @@
     uint64_t BaseOffset;
 
     if (I->isVirtual()) {
+      // If we don't know this vbase yet, don't visit it. It will be visited
+      // later.
+      if (!VBases.count(Base))
+        continue;
+  
       // We want the vbase offset from the class we're currently laying out.
-      assert(VBases.count(Base) && "Did not find virtual base!");
       BaseOffset = VBases[Base];
     } else if (RD == MostDerivedClass) {
       // We want the base offset from the class we're currently laying out.

Modified: cfe/trunk/test/CodeGenCXX/vtable-layout.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/vtable-layout.cpp?rev=100952&r1=100951&r2=100952&view=diff
==============================================================================
--- cfe/trunk/test/CodeGenCXX/vtable-layout.cpp (original)
+++ cfe/trunk/test/CodeGenCXX/vtable-layout.cpp Sat Apr 10 16:35:33 2010
@@ -1364,3 +1364,26 @@
 void D::f() { }
 
 }
+
+namespace Test32 {
+
+// Check that we correctly lay out the virtual bases of 'Test32::D'.
+
+struct A {
+  virtual void f();
+};
+
+struct B : virtual A { };
+struct C : A, virtual B { };
+struct D : virtual B { };
+
+// CHECK:      Virtual base offset offsets for 'Test32::E' (3 entries).
+// CHECK-NEXT:    Test32::A | -32
+// CHECK-NEXT:    Test32::B | -24
+// CHECK-NEXT:    Test32::D | -40
+struct E : C, virtual D {
+  virtual void f();
+};
+void E::f() { }
+
+}





More information about the cfe-commits mailing list