]> granicus.if.org Git - clang/commitdiff
MS ABI: Mark direct virtual bases as visted when building vtable paths
authorReid Kleckner <reid@kleckner.net>
Tue, 25 Mar 2014 18:33:27 +0000 (18:33 +0000)
committerReid Kleckner <reid@kleckner.net>
Tue, 25 Mar 2014 18:33:27 +0000 (18:33 +0000)
Fixes PR19240.  In retrospect, this is a fairly obvious bug.  :)

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@204744 91177308-0d34-0410-b5e6-96231b3b80d8

lib/AST/VTableBuilder.cpp
test/CodeGenCXX/microsoft-abi-vtables-virtual-inheritance.cpp

index 12c5b8f68790b8f3a98b9c3bfcf845f9e2c1be88..eef91f7416e357c7bf7802c687347daf063e2b07 100644 (file)
@@ -3210,6 +3210,8 @@ void MicrosoftVTableContext::computeVTablePaths(bool ForVBTables,
     // morally virtual bases.
     for (const auto &I : Base->vbases())
       VBasesSeen.insert(I.getType()->getAsCXXRecordDecl());
+    if (I.isVirtual())
+      VBasesSeen.insert(Base);
   }
 
   // Sort the paths into buckets, and if any of them are ambiguous, extend all
index 2788965d46a71367d1272204fd0fb62289ec68a5..634f583e7358d73912b07b3d6ba7151ae4ce2552 100644 (file)
@@ -659,3 +659,26 @@ C c;
 // MANGLING-DAG: @"\01??_7C@pr17748@@6BA@1@@"
 // MANGLING-DAG: @"\01??_7C@pr17748@@6BB@1@@"
 }
+
+namespace pr19240 {
+struct A {
+  virtual void c();
+};
+
+struct B : virtual A {
+  virtual void c();
+};
+
+struct C { };
+
+struct D : virtual A, virtual C, B {};
+
+D obj;
+
+// Each MDC only has one vftable.
+
+// MANGLING-DAG: @"\01??_7D@pr19240@@6B@"
+// MANGLING-DAG: @"\01??_7A@pr19240@@6B@"
+// MANGLING-DAG: @"\01??_7B@pr19240@@6B@"
+
+}