Kaydet (Commit) faa74911 authored tarafından Stephan Bergmann's avatar Stephan Bergmann

Fix loplugin:vclwidgets' disposeOnce check

Found when trying to temporarily add a SAL_DEBUG to (otherwise empty)
~NotebookbarTabControl (sfx2/source/notebookbar/NotebookbarTabControl).
üst 272d5a02
...@@ -199,7 +199,8 @@ bool VCLWidgets::VisitCXXDestructorDecl(const CXXDestructorDecl* pCXXDestructorD ...@@ -199,7 +199,8 @@ bool VCLWidgets::VisitCXXDestructorDecl(const CXXDestructorDecl* pCXXDestructorD
<< pCXXDestructorDecl->getSourceRange(); << pCXXDestructorDecl->getSourceRange();
return true; return true;
} }
// check that the destructor for a BASE_REF_COUNTED_CLASS subclass does nothing except call into the disposeOnce() method // Check that the destructor for a BASE_REF_COUNTED_CLASS subclass either
// only calls disposeOnce() or, if !bFoundVclPtrField, does nothing at all:
bool bOk = false; bool bOk = false;
if (pCompoundStatement) { if (pCompoundStatement) {
bool bFoundDisposeOnce = false; bool bFoundDisposeOnce = false;
...@@ -207,29 +208,39 @@ bool VCLWidgets::VisitCXXDestructorDecl(const CXXDestructorDecl* pCXXDestructorD ...@@ -207,29 +208,39 @@ bool VCLWidgets::VisitCXXDestructorDecl(const CXXDestructorDecl* pCXXDestructorD
for (auto i = pCompoundStatement->body_begin(); for (auto i = pCompoundStatement->body_begin();
i != pCompoundStatement->body_end(); ++i) i != pCompoundStatement->body_end(); ++i)
{ {
const CXXMemberCallExpr *pCallExpr = dyn_cast<CXXMemberCallExpr>( //TODO: The below erroneously also skips past entire statements like
*i); //
if (pCallExpr) { // assert(true), ...;
//
auto skip = false;
for (auto loc = (*i)->getLocStart();
compiler.getSourceManager().isMacroBodyExpansion(loc);
loc = compiler.getSourceManager().getImmediateMacroCallerLoc(
loc))
{
auto const name = Lexer::getImmediateMacroName(
loc, compiler.getSourceManager(), compiler.getLangOpts());
if (name == "SAL_DEBUG" || name == "assert") {
skip = true;
break;
}
}
if (skip) {
continue;
}
if (auto const pCallExpr = dyn_cast<CXXMemberCallExpr>(*i)) {
if( const FunctionDecl* func = pCallExpr->getDirectCallee()) { if( const FunctionDecl* func = pCallExpr->getDirectCallee()) {
if( func->getNumParams() == 0 && func->getIdentifier() != NULL if( func->getNumParams() == 0 && func->getIdentifier() != NULL
&& ( func->getName() == "disposeOnce" )) { && ( func->getName() == "disposeOnce" )) {
bFoundDisposeOnce = true; bFoundDisposeOnce = true;
continue;
} }
} }
} }
if (!pCallExpr) { nNumExtraStatements++;
auto loc = (*i)->getLocStart();
if (!compiler.getSourceManager().isMacroBodyExpansion(loc)
|| (Lexer::getImmediateMacroName(
loc, compiler.getSourceManager(),
compiler.getLangOpts())
!= "assert"))
{
nNumExtraStatements++;
}
}
} }
bOk = bFoundDisposeOnce && nNumExtraStatements == 0; bOk = (bFoundDisposeOnce || !bFoundVclPtrField)
&& nNumExtraStatements == 0;
} }
if (!bOk) { if (!bOk) {
SourceLocation spellingLocation = compiler.getSourceManager().getSpellingLoc( SourceLocation spellingLocation = compiler.getSourceManager().getSpellingLoc(
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment