freebsd-ports/lang/clang31/files/patch-tools_clang_lib_Sema_SemaDeclCXX.cpp
Brooks Davis eaca7581b2 In preparation for updating llvm and clang to 3.2, create temporary
ports of 3.1 so ports that don't yet work with 3.2 continue to work.
2013-01-10 16:19:44 +00:00

37 lines
1.4 KiB
C++

$FreeBSD$
--- tools/clang/lib/Sema/SemaDeclCXX.cpp.orig
+++ tools/clang/lib/Sema/SemaDeclCXX.cpp
@@ -10795,14 +10795,23 @@
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;
-
- // C++ [basic.def.odr]p2:
- // [...] A virtual member function is used if it is not pure. [...]
- if (MD->isVirtual() && !MD->isPure())
- MarkFunctionReferenced(Loc, MD);
+ // Mark all functions which will appear in RD's vtable as used.
+ CXXFinalOverriderMap FinalOverriders;
+ RD->getFinalOverriders(FinalOverriders);
+ for (CXXFinalOverriderMap::const_iterator I = FinalOverriders.begin(),
+ E = FinalOverriders.end();
+ I != E; ++I) {
+ for (OverridingMethods::const_iterator OI = I->second.begin(),
+ OE = I->second.end();
+ OI != OE; ++OI) {
+ assert(OI->second.size() > 0 && "no final overrider");
+ CXXMethodDecl *Overrider = OI->second.front().Method;
+
+ // C++ [basic.def.odr]p2:
+ // [...] A virtual member function is used if it is not pure. [...]
+ if (!Overrider->isPure())
+ MarkFunctionReferenced(Loc, Overrider);
+ }
}
// Only classes that have virtual bases need a VTT.