From ca0bbff3a70b0a2dde3426af546b01f93cf2f166 Mon Sep 17 00:00:00 2001 From: Gabor Horvath Date: Wed, 25 Feb 2015 12:17:03 +0000 Subject: [PATCH] [clang-tidy] Fixed a false positive case in misc-inaccurate-erase checker. llvm-svn: 230483 --- clang-tools-extra/clang-tidy/misc/InaccurateEraseCheck.cpp | 4 ++-- .../test/clang-tidy/misc-inaccurate-erase.cpp | 14 ++++++++++++-- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/clang-tools-extra/clang-tidy/misc/InaccurateEraseCheck.cpp b/clang-tools-extra/clang-tidy/misc/InaccurateEraseCheck.cpp index 033e0a1..80174ad 100644 --- a/clang-tools-extra/clang-tidy/misc/InaccurateEraseCheck.cpp +++ b/clang-tools-extra/clang-tidy/misc/InaccurateEraseCheck.cpp @@ -26,10 +26,10 @@ void InaccurateEraseCheck::registerMatchers(MatchFinder *Finder) { Finder->addMatcher( memberCallExpr( - on(hasType(namedDecl(matchesName("std::")))), + on(hasType(namedDecl(matchesName("^::std::")))), callee(methodDecl(hasName("erase"))), argumentCountIs(1), hasArgument(0, has(callExpr(callee(functionDecl(matchesName( - "std::(remove_if|remove|unique)"))), + "^::std::(remove(_if)?|unique)$"))), CheckForEndCall).bind("InaccAlgCall"))), unless(isInTemplateInstantiation())).bind("InaccErase"), this); diff --git a/clang-tools-extra/test/clang-tidy/misc-inaccurate-erase.cpp b/clang-tools-extra/test/clang-tidy/misc-inaccurate-erase.cpp index 1693b9f..4d09711 100644 --- a/clang-tools-extra/test/clang-tidy/misc-inaccurate-erase.cpp +++ b/clang-tools-extra/test/clang-tidy/misc-inaccurate-erase.cpp @@ -2,10 +2,13 @@ // REQUIRES: shell namespace std { -struct vec_iterator {}; +template struct vec_iterator { + T *ptr; + vec_iterator operator++(int); +}; template struct vector { - typedef vec_iterator iterator; + typedef vec_iterator iterator; iterator begin(); iterator end(); @@ -21,6 +24,8 @@ template FwIt remove_if(FwIt begin, FwIt end, Func f); template FwIt unique(FwIt begin, FwIt end); + +template struct unique_ptr {}; } // namespace std struct custom_iter {}; @@ -64,4 +69,9 @@ int main() { ERASE(v, 15); // CHECK-MESSAGES: :[[@LINE-1]]:9: warning: this call will remove at most one // CHECK-FIXES: {{^ }}ERASE(v, 15);{{$}} + + std::vector> vupi; + auto iter = vupi.begin(); + vupi.erase(iter++); + // CHECK-FIXES: {{^ }}vupi.erase(iter++);{{$}} } -- 2.7.4