diff options
Diffstat (limited to 'compilerplugins/clang/useuniqueptr.cxx')
-rw-r--r-- | compilerplugins/clang/useuniqueptr.cxx | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/compilerplugins/clang/useuniqueptr.cxx b/compilerplugins/clang/useuniqueptr.cxx index 7095ddff0b62..1192513a17d0 100644 --- a/compilerplugins/clang/useuniqueptr.cxx +++ b/compilerplugins/clang/useuniqueptr.cxx @@ -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); } |