diff options
| -rw-r--r-- | clang-tools-extra/clang-tidy/readability/ContainerSizeEmptyCheck.cpp | 8 | ||||
| -rw-r--r-- | clang-tools-extra/test/clang-tidy/readability-container-size-empty.cpp | 9 | 
2 files changed, 15 insertions, 2 deletions
diff --git a/clang-tools-extra/clang-tidy/readability/ContainerSizeEmptyCheck.cpp b/clang-tools-extra/clang-tidy/readability/ContainerSizeEmptyCheck.cpp index 60a153a8032..97f9eb714be 100644 --- a/clang-tools-extra/clang-tidy/readability/ContainerSizeEmptyCheck.cpp +++ b/clang-tools-extra/clang-tidy/readability/ContainerSizeEmptyCheck.cpp @@ -213,6 +213,14 @@ void ContainerSizeEmptyCheck::check(const MatchFinder::MatchResult &Result) {    }    const auto *Container = Result.Nodes.getNodeAs<NamedDecl>("container"); +  if (const auto *CTS = dyn_cast<ClassTemplateSpecializationDecl>(Container)) { +    // The definition of the empty() method is the same for all implicit +    // instantiations. In order to avoid duplicate or inconsistent warnings +    // (depending on how deduplication is done), we use the same class name +    // for all implicit instantiations of a template. +    if (CTS->getSpecializationKind() == TSK_ImplicitInstantiation) +      Container = CTS->getSpecializedTemplate(); +  }    const auto *Empty = Result.Nodes.getNodeAs<FunctionDecl>("empty");    diag(Empty->getLocation(), "method %0::empty() defined here", diff --git a/clang-tools-extra/test/clang-tidy/readability-container-size-empty.cpp b/clang-tools-extra/test/clang-tidy/readability-container-size-empty.cpp index 65d5c8ebdc4..c67d9275bbf 100644 --- a/clang-tools-extra/test/clang-tidy/readability-container-size-empty.cpp +++ b/clang-tools-extra/test/clang-tidy/readability-container-size-empty.cpp @@ -113,12 +113,12 @@ int main() {      ;    // CHECK-MESSAGES: :[[@LINE-2]]:7: warning: the 'empty' method should be used to check for emptiness instead of 'size' [readability-container-size-empty]    // CHECK-FIXES: {{^  }}if (intSet.empty()){{$}} -  // CHECK-MESSAGES: :32:8: note: method 'set<int>'::empty() defined here +  // CHECK-MESSAGES: :32:8: note: method 'set'::empty() defined here    if (intSet == std::set<int>())      ;    // CHECK-MESSAGES: :[[@LINE-2]]:7: warning: the 'empty' method should be used to check for emptiness    // CHECK-FIXES: {{^  }}if (intSet.empty()){{$}} -  // CHECK-MESSAGES: :32:8: note: method 'set<int>'::empty() defined here +  // CHECK-MESSAGES: :32:8: note: method 'set'::empty() defined here    if (s_func() == "")      ;    // CHECK-MESSAGES: :[[@LINE-2]]:7: warning: the 'empty' method should be used @@ -407,6 +407,7 @@ template <typename T> void f() {    if (v.size())      ;    // CHECK-MESSAGES: :[[@LINE-2]]:7: warning: the 'empty' method should be used to check for emptiness instead of 'size' [readability-container-size-empty] +  // CHECK-MESSAGES: :9:8: note: method 'vector'::empty() defined here    // CHECK-FIXES: {{^  }}if (!v.empty()){{$}}    if (v == std::vector<T>())      ; @@ -415,20 +416,24 @@ template <typename T> void f() {    // CHECK-FIXES-NEXT: ;    CHECKSIZE(v);    // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: the 'empty' method should be used +  // CHECK-MESSAGES: :9:8: note: method 'vector'::empty() defined here    // CHECK-FIXES: CHECKSIZE(v);    TemplatedContainer<T> templated_container;    if (templated_container.size())      ;    // CHECK-MESSAGES: :[[@LINE-2]]:7: warning: the 'empty' method should be used +  // CHECK-MESSAGES: :44:8: note: method 'TemplatedContainer'::empty() defined here    // CHECK-FIXES: {{^  }}if (!templated_container.empty()){{$}}    if (templated_container != TemplatedContainer<T>())      ;    // CHECK-MESSAGES: :[[@LINE-2]]:7: warning: the 'empty' method should be used +  // CHECK-MESSAGES: :44:8: note: method 'TemplatedContainer'::empty() defined here    // CHECK-FIXES: {{^  }}if (!templated_container.empty()){{$}}    // CHECK-FIXES-NEXT: ;    CHECKSIZE(templated_container);    // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: the 'empty' method should be used +  // CHECK-MESSAGES: :44:8: note: method 'TemplatedContainer'::empty() defined here    // CHECK-FIXES: CHECKSIZE(templated_container);  }  | 

