[clang-tools-extra] r304811 - [clang-tidy] misc-inaccurate-erase: support call by pointer

Alexander Kornienko via cfe-commits cfe-commits at lists.llvm.org
Tue Jun 6 10:49:45 PDT 2017


Author: alexfh
Date: Tue Jun  6 12:49:45 2017
New Revision: 304811

URL: http://llvm.org/viewvc/llvm-project?rev=304811&view=rev
Log:
[clang-tidy] misc-inaccurate-erase: support call by pointer

+ replace matchesName calls with more efficient alternatives.

Modified:
    clang-tools-extra/trunk/clang-tidy/misc/InaccurateEraseCheck.cpp
    clang-tools-extra/trunk/test/clang-tidy/misc-inaccurate-erase.cpp

Modified: clang-tools-extra/trunk/clang-tidy/misc/InaccurateEraseCheck.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/misc/InaccurateEraseCheck.cpp?rev=304811&r1=304810&r2=304811&view=diff
==============================================================================
--- clang-tools-extra/trunk/clang-tidy/misc/InaccurateEraseCheck.cpp (original)
+++ clang-tools-extra/trunk/clang-tidy/misc/InaccurateEraseCheck.cpp Tue Jun  6 12:49:45 2017
@@ -18,6 +18,10 @@ namespace clang {
 namespace tidy {
 namespace misc {
 
+namespace {
+AST_MATCHER(Decl, isInStdNamespace) { return Node.isInStdNamespace(); }
+}
+
 void InaccurateEraseCheck::registerMatchers(MatchFinder *Finder) {
   // Only register the matchers for C++; the functionality currently does not
   // provide any benefit to other languages, despite being benign.
@@ -30,13 +34,14 @@ void InaccurateEraseCheck::registerMatch
                        .bind("InaccEndCall")))),
                anything()));
 
+  const auto DeclInStd = decl(isInStdNamespace());
   Finder->addMatcher(
       cxxMemberCallExpr(
-          on(hasType(namedDecl(matchesName("^::std::")))),
+          on(anyOf(hasType(DeclInStd), hasType(pointsTo(DeclInStd)))),
           callee(cxxMethodDecl(hasName("erase"))), argumentCountIs(1),
           hasArgument(0, has(ignoringParenImpCasts(
-                             callExpr(callee(functionDecl(matchesName(
-                                          "^::std::(remove(_if)?|unique)$"))),
+                             callExpr(callee(functionDecl(hasAnyName(
+                                          "remove", "remove_if", "unique"))),
                                       CheckForEndCall)
                                  .bind("InaccAlgCall")))),
           unless(isInTemplateInstantiation()))

Modified: clang-tools-extra/trunk/test/clang-tidy/misc-inaccurate-erase.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-tidy/misc-inaccurate-erase.cpp?rev=304811&r1=304810&r2=304811&view=diff
==============================================================================
--- clang-tools-extra/trunk/test/clang-tidy/misc-inaccurate-erase.cpp (original)
+++ clang-tools-extra/trunk/test/clang-tidy/misc-inaccurate-erase.cpp Tue Jun  6 12:49:45 2017
@@ -56,6 +56,12 @@ int main() {
   // CHECK-FIXES: {{^  }}v.erase(remove(v.begin(), v.end(), 10), v.end());{{$}}
   v.erase(remove(v.begin(), v.end(), 20), v.end());
 
+  auto *p = &v;
+  p->erase(remove(p->begin(), p->end(), 11));
+  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: this call will remove at most one
+  // CHECK-FIXES: {{^  }}p->erase(remove(p->begin(), p->end(), 11), p->end());{{$}}
+
+
   // Fix is not trivial.
   auto it = v.end();
   v.erase(remove(v.begin(), it, 10));




More information about the cfe-commits mailing list