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)); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits