Explicitly mark overriding destructors as "virtual"

It appears that the C++ standard allows overriding destructors to be marked
"override," but at least some MSVC versions complain about it, so at least make
sure such destructors are explicitly marked "virtual."

Change-Id: I0e1cafa7584fd16ebdce61f569eae2373a71b0a1
This commit is contained in:
Stephan Bergmann
2014-04-01 19:18:35 +02:00
parent b66d870868
commit 362d4f0cd4
1367 changed files with 1932 additions and 1914 deletions

View File

@@ -40,13 +40,31 @@ bool SalOverride::VisitCXXMethodDecl(CXXMethodDecl const * decl) {
// external QtCore/qobjectdefs.h:
if (ignoreLocation(decl) || !compat::isFirstDecl(*decl)
|| decl->begin_overridden_methods() == decl->end_overridden_methods()
|| decl->hasAttr<OverrideAttr>() || isa<CXXDestructorDecl>(decl)
|| decl->hasAttr<OverrideAttr>()
|| ignoreLocation(
compiler.getSourceManager().getSpellingLoc(
decl->getNameInfo().getLoc())))
{
return true;
}
// It appears that the C++ standard allows overriding destructors to be
// marked "override," but at least some MSVC versions complain about it, so
// at least make sure such destructors are explicitly marked "virtual":
if (isa<CXXDestructorDecl>(decl)) {
if (!decl->isVirtualAsWritten()
&& (rewriter == nullptr
|| !insertTextBefore(
decl->getSourceRange().getBegin(), "virtual ")))
{
report(
DiagnosticsEngine::Warning,
("overriding destructor declaration not explicitly marked"
" 'virtual'"),
decl->getLocation())
<< decl->getSourceRange();
}
return true;
}
#if LO_COMPILERPLUGINS_CLANG_COMPAT_HAVE_isAtEndOfImmediateMacroExpansion
if (rewriter != nullptr) {
// In void MACRO(...); getSourceRange().getEnd() would (erroneously?)