1010#include " ../ClangTidyCheck.h"
1111#include " ../utils/Matchers.h"
1212#include " ../utils/OptionsUtils.h"
13- #include " clang/AST/ASTContext.h"
1413#include " clang/ASTMatchers/ASTMatchFinder.h"
1514
16- using namespace clang ::ast_matchers;
15+ using namespace clang ::ast_matchers; // NOLINT
1716
1817namespace clang ::tidy::bugprone {
1918namespace {
@@ -25,8 +24,10 @@ AST_MATCHER_P(QualType, isSharedPointer,
2524 clang::ast_matchers::internal::Matcher<NamedDecl>, InnerMatcher) {
2625 if (const auto *RD = Node.getTypePtr ()->getAsCXXRecordDecl (); RD != nullptr ) {
2726 return InnerMatcher.matches (*RD, Finder, Builder);
28- } else if (const auto *ED = Node.getTypePtr ()->getAs <ElaboratedType>();
29- ED != nullptr ) {
27+ }
28+
29+ if (const auto *ED = Node.getTypePtr ()->getAs <ElaboratedType>();
30+ ED != nullptr ) {
3031 if (const auto *TS = ED->getNamedType ()
3132 .getTypePtr ()
3233 ->getAs <TemplateSpecializationType>();
@@ -44,17 +45,16 @@ AST_MATCHER_P(QualType, isSharedPointer,
4445MoveSharedPointerContentsCheck::MoveSharedPointerContentsCheck (
4546 StringRef Name, ClangTidyContext *Context)
4647 : ClangTidyCheck(Name, Context),
47- SharedPointerClasses (utils::options::parseStringList(
48- Options.get(" SharedPointerClasses" ,
49- " ::std::shared_ptr;::boost::shared_pointer" ))) {}
48+ SharedPointerClasses (utils::options::parseStringList(Options.get(
49+ " SharedPointerClasses" , " ::std::shared_ptr;::boost::shared_ptr" ))) {}
5050
5151void MoveSharedPointerContentsCheck::registerMatchers (MatchFinder *Finder) {
52- auto isStdMove =
52+ auto IsStdMove =
5353 callee (functionDecl (hasAnyName (" ::std::move" , " ::std::forward" )));
5454
55- auto resolvedType = callExpr (anyOf (
55+ auto ResolvedType = callExpr (anyOf (
5656 // Resolved type, direct move.
57- callExpr (isStdMove ,
57+ callExpr (IsStdMove ,
5858 hasArgument (
5959 0 , cxxOperatorCallExpr (
6060 hasOverloadedOperatorName (" *" ),
@@ -65,28 +65,26 @@ void MoveSharedPointerContentsCheck::registerMatchers(MatchFinder *Finder) {
6565 callee (cxxMethodDecl ()))))
6666 .bind (" call" ),
6767 // Resolved type, move out of get().
68- callExpr (
69- isStdMove,
70- hasArgument (
71- 0 , unaryOperator (
72- hasOperatorName (" *" ),
73- hasUnaryOperand (allOf (
74- hasDescendant (declRefExpr (hasType (qualType (
75- isSharedPointer (matchers::matchesAnyListedName (
76- SharedPointerClasses)))))),
77- cxxMemberCallExpr (
78- callee (cxxMethodDecl (hasName (" get" )))))))))
68+ callExpr (IsStdMove,
69+ hasArgument (
70+ 0 , unaryOperator (hasOperatorName (" *" ),
71+
72+ hasUnaryOperand (cxxMemberCallExpr (
73+ callee (cxxMethodDecl (hasName (" get" ))),
74+ on (hasType (qualType (isSharedPointer (
75+ matchers::matchesAnyListedName (
76+ SharedPointerClasses))))))))))
7977 .bind (" get_call" )));
8078
81- Finder->addMatcher (resolvedType , this );
79+ Finder->addMatcher (ResolvedType , this );
8280
83- auto isStdMoveUnresolved = callee (unresolvedLookupExpr (
81+ auto IsStdMoveUnresolved = callee (unresolvedLookupExpr (
8482 hasAnyDeclaration (namedDecl (hasUnderlyingDecl (hasName (" ::std::move" ))))));
8583
86- auto unresolvedType = callExpr (anyOf (
84+ auto UnResolvedType = callExpr (anyOf (
8785 // Unresolved type, direct move.
8886 callExpr (
89- isStdMoveUnresolved ,
87+ IsStdMoveUnresolved ,
9088 hasArgument (0 , unaryOperator (
9189 hasOperatorName (" *" ),
9290 hasUnaryOperand (declRefExpr (hasType (qualType (
@@ -99,7 +97,7 @@ void MoveSharedPointerContentsCheck::registerMatchers(MatchFinder *Finder) {
9997 // just fetch the variable. This does leave a gap where a temporary
10098 // shared_ptr wouldn't be caught, but moving out of a temporary
10199 // shared pointer is a truly wild thing to do so it should be okay.
102- callExpr (isStdMoveUnresolved ,
100+ callExpr (IsStdMoveUnresolved ,
103101 hasArgument (
104102 0 , unaryOperator (
105103 hasOperatorName (" *" ),
@@ -110,15 +108,15 @@ void MoveSharedPointerContentsCheck::registerMatchers(MatchFinder *Finder) {
110108 SharedPointerClasses)))))))))))
111109 .bind (" unresolved_get_call" )));
112110
113- Finder->addMatcher (unresolvedType , this );
111+ Finder->addMatcher (UnResolvedType , this );
114112}
115113
116114void MoveSharedPointerContentsCheck::check (
117115 const MatchFinder::MatchResult &Result) {
118116 const CallExpr *Call = nullptr ;
119- for (const llvm::StringRef binding :
117+ for (const llvm::StringRef Binding :
120118 {" unresolved_call" , " unresolved_get_call" , " get_call" , " call" }) {
121- if (const auto *C = Result.Nodes .getNodeAs <CallExpr>(binding );
119+ if (const auto *C = Result.Nodes .getNodeAs <CallExpr>(Binding );
122120 C != nullptr ) {
123121 Call = C;
124122 break ;
0 commit comments