loplugin useuniqueptr improvement

passing owning pointers to constructors

Change-Id: I4e64cabbf449393b77162a845b3138be415e2dc9
Reviewed-on: https://gerrit.libreoffice.org/59346
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
Tested-by: Noel Grandin <noel.grandin@collabora.co.uk>
This commit is contained in:
Noel Grandin
2018-08-17 14:40:29 +02:00
parent 96e7368643
commit be806964a1
2 changed files with 44 additions and 0 deletions

View File

@@ -124,6 +124,8 @@ public:
bool VisitCompoundStmt(const CompoundStmt* );
bool VisitCXXDeleteExpr(const CXXDeleteExpr* );
bool TraverseFunctionDecl(FunctionDecl* );
bool TraverseConstructorInitializer(CXXCtorInitializer*);
private:
void CheckCompoundStmt(const CXXMethodDecl*, const CompoundStmt* );
void CheckForUnconditionalDelete(const CXXMethodDecl*, const CompoundStmt* );
@@ -532,6 +534,28 @@ bool UseUniquePtr::VisitCXXDeleteExpr(const CXXDeleteExpr* deleteExpr)
return true;
}
bool UseUniquePtr::TraverseConstructorInitializer(CXXCtorInitializer * ctorInit)
{
if (!ctorInit->getSourceLocation().isValid() || ignoreLocation(ctorInit->getSourceLocation()))
return true;
if (!ctorInit->getMember())
return true;
if (!loplugin::TypeCheck(ctorInit->getMember()->getType()).Class("unique_ptr").StdNamespace())
return true;
auto constructExpr = dyn_cast<CXXConstructExpr>(ctorInit->getInit());
if (!constructExpr)
return true;
auto init = constructExpr->getArg(0)->IgnoreImpCasts();
if (!isa<DeclRefExpr>(init))
return true;
report(
DiagnosticsEngine::Warning,
"should be passing via std::unique_ptr param",
ctorInit->getSourceLocation())
<< ctorInit->getSourceRange();
return RecursiveASTVisitor<UseUniquePtr>::TraverseConstructorInitializer(ctorInit);
}
loplugin::Plugin::Registration< UseUniquePtr > X("useuniqueptr", false);
}