summaryrefslogtreecommitdiffstats
path: root/clang/lib/Sema/SemaDeclCXX.cpp
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2010-03-26 00:36:59 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2010-03-26 00:36:59 +0000
commit5b334084818a5897051aa1063bf24a5bb3890373 (patch)
treec6ed7322fae204d56d5d6133779d1cc942d72739 /clang/lib/Sema/SemaDeclCXX.cpp
parente67698bd73ead4ffe1e351d19adf2905967c87d7 (diff)
downloadbcm5719-llvm-5b334084818a5897051aa1063bf24a5bb3890373.tar.gz
bcm5719-llvm-5b334084818a5897051aa1063bf24a5bb3890373.zip
Mark virtual methods that are used in tables included in VTTs as used.
Fixes PR6706. llvm-svn: 99582
Diffstat (limited to 'clang/lib/Sema/SemaDeclCXX.cpp')
-rw-r--r--clang/lib/Sema/SemaDeclCXX.cpp18
1 files changed, 17 insertions, 1 deletions
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp
index 9a68f472e67..1f6630e3436 100644
--- a/clang/lib/Sema/SemaDeclCXX.cpp
+++ b/clang/lib/Sema/SemaDeclCXX.cpp
@@ -5944,7 +5944,8 @@ bool Sema::ProcessPendingClassesWithUnmarkedVirtualMembers() {
return true;
}
-void Sema::MarkVirtualMembersReferenced(SourceLocation Loc, CXXRecordDecl *RD) {
+void Sema::MarkVirtualMembersReferenced(SourceLocation Loc,
+ const CXXRecordDecl *RD) {
for (CXXRecordDecl::method_iterator i = RD->method_begin(),
e = RD->method_end(); i != e; ++i) {
CXXMethodDecl *MD = *i;
@@ -5954,4 +5955,19 @@ void Sema::MarkVirtualMembersReferenced(SourceLocation Loc, CXXRecordDecl *RD) {
if (MD->isVirtual() && !MD->isPure())
MarkDeclarationReferenced(Loc, MD);
}
+
+ // Only classes that have virtual bases need a VTT.
+ if (RD->getNumVBases() == 0)
+ return;
+
+ for (CXXRecordDecl::base_class_const_iterator i = RD->bases_begin(),
+ e = RD->bases_end(); i != e; ++i) {
+ const CXXRecordDecl *Base =
+ cast<CXXRecordDecl>(i->getType()->getAs<RecordType>()->getDecl());
+ if (i->isVirtual())
+ continue;
+ if (Base->getNumVBases() == 0)
+ continue;
+ MarkVirtualMembersReferenced(Loc, Base);
+ }
}
OpenPOWER on IntegriCloud