Fixed an issue with the clang type creation code for C++ classes where we wouldn't set a CXXRecordDecl to be NOT empty if we had base classes that were not empty or had virtual functions.
git-svn-id: https://llvm.org/svn/llvm-project/llvdb/trunk@114484 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/source/Symbol/ClangASTContext.cpp b/source/Symbol/ClangASTContext.cpp
index a9e1c37..a00c00e 100644
--- a/source/Symbol/ClangASTContext.cpp
+++ b/source/Symbol/ClangASTContext.cpp
@@ -1093,8 +1093,33 @@
CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_type->getDecl());
if (cxx_record_decl)
{
- //cxx_record_decl->setEmpty (false);
cxx_record_decl->setBases(base_classes, num_base_classes);
+
+ if (cxx_record_decl->isEmpty())
+ {
+ // set empty to false if any bases are virtual, or not empty.
+
+ CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
+ for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
+ base_class != base_class_end;
+ ++base_class)
+ {
+ if (base_class->isVirtual())
+ {
+ cxx_record_decl->setEmpty (false);
+ break;
+ }
+ else
+ {
+ const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
+ if (!base_class_decl->isEmpty())
+ {
+ cxx_record_decl->setEmpty (false);
+ break;
+ }
+ }
+ }
+ }
return true;
}
}