diff options
author | Anders Carlsson <andersca@mac.com> | 2010-02-06 02:27:10 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2010-02-06 02:27:10 +0000 |
commit | 0da714a3e2168930c7ac186df37d6acddda96e32 (patch) | |
tree | def632d0c93a8b12b1c0c91bb8421f432684159b /clang/lib/Sema/SemaDecl.cpp | |
parent | db2eb47835caec3f521dc1495d551417c3b2d7d9 (diff) | |
download | bcm5719-llvm-0da714a3e2168930c7ac186df37d6acddda96e32.tar.gz bcm5719-llvm-0da714a3e2168930c7ac186df37d6acddda96e32.zip |
Implement a warning diagnostic for weak vtables. Fixes PR6116.
llvm-svn: 95472
Diffstat (limited to 'clang/lib/Sema/SemaDecl.cpp')
-rw-r--r-- | clang/lib/Sema/SemaDecl.cpp | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index 52fc9b74e0c..659969334ed 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -5002,9 +5002,16 @@ RecordDynamicClassesWithNoKeyFunction(Sema &S, CXXRecordDecl *Record, if (Record->isDependentContext() || !Record->isDefinition()) return; - if (Record->isDynamicClass() && !S.Context.getKeyFunction(Record)) - S.ClassesWithUnmarkedVirtualMembers.push_back(std::make_pair(Record, Loc)); + if (Record->isDynamicClass()) { + const CXXMethodDecl *KeyFunction = S.Context.getKeyFunction(Record); + if (!KeyFunction) + S.ClassesWithUnmarkedVirtualMembers.push_back(std::make_pair(Record, Loc)); + + if ((!KeyFunction || KeyFunction->getBody() && KeyFunction->isInlined()) && + Record->getLinkage() == ExternalLinkage) + S.Diag(Record->getLocation(), diag::warn_weak_vtable) << Record; + } for (DeclContext::decl_iterator D = Record->decls_begin(), DEnd = Record->decls_end(); D != DEnd; ++D) { |