зеркало из https://github.com/microsoft/clang-1.git
Change CollectPrimaryBases to collect the bases in the right order. Fixes one half of PR9660.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@129252 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
d24e50c2e6
Коммит
b8bced0b75
|
@ -2306,14 +2306,16 @@ void VTableBuilder::dumpLayout(llvm::raw_ostream& Out) {
|
|||
static void
|
||||
CollectPrimaryBases(const CXXRecordDecl *RD, ASTContext &Context,
|
||||
VTableBuilder::PrimaryBasesSetVectorTy &PrimaryBases) {
|
||||
while (RD) {
|
||||
const ASTRecordLayout &Layout = Context.getASTRecordLayout(RD);
|
||||
const CXXRecordDecl *PrimaryBase = Layout.getPrimaryBase();
|
||||
if (PrimaryBase)
|
||||
PrimaryBases.insert(PrimaryBase);
|
||||
const ASTRecordLayout &Layout = Context.getASTRecordLayout(RD);
|
||||
const CXXRecordDecl *PrimaryBase = Layout.getPrimaryBase();
|
||||
|
||||
RD = PrimaryBase;
|
||||
}
|
||||
if (!PrimaryBase)
|
||||
return;
|
||||
|
||||
CollectPrimaryBases(PrimaryBase, Context, PrimaryBases);
|
||||
|
||||
if (!PrimaryBases.insert(PrimaryBase))
|
||||
assert(false && "Found a duplicate primary base!");
|
||||
}
|
||||
|
||||
void CodeGenVTables::ComputeMethodVTableIndices(const CXXRecordDecl *RD) {
|
||||
|
|
|
@ -41,6 +41,7 @@
|
|||
// RUN: FileCheck --check-prefix=CHECK-40 %s < %t
|
||||
// RUN: FileCheck --check-prefix=CHECK-41 %s < %t
|
||||
// RUN: FileCheck --check-prefix=CHECK-42 %s < %t
|
||||
// RUN: FileCheck --check-prefix=CHECK-43 %s < %t
|
||||
|
||||
// For now, just verify this doesn't crash.
|
||||
namespace test0 {
|
||||
|
@ -1679,3 +1680,24 @@ struct D : virtual B, C {
|
|||
void D::g() { }
|
||||
|
||||
}
|
||||
|
||||
namespace Test37 {
|
||||
|
||||
// Test that we give C::f the right vtable index. (PR9660).
|
||||
struct A {
|
||||
virtual A* f() = 0;
|
||||
};
|
||||
|
||||
struct B : virtual A {
|
||||
virtual B* f();
|
||||
};
|
||||
|
||||
// CHECK-43: VTable indices for 'Test37::C' (1 entries).
|
||||
// CHECK-43-NEXT: 1 | Test37::C *Test37::C::f()
|
||||
struct C : B {
|
||||
virtual C* f();
|
||||
};
|
||||
|
||||
C* C::f() { return 0; }
|
||||
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче