Author: alexfh Date: Tue Nov 27 02:53:44 2018 New Revision: 347652 URL: http://llvm.org/viewvc/llvm-project?rev=347652&view=rev Log: [clang-tidy] Avoid inconsistent notes in readability-container-size-empty
When a warning is issued in a template instantiation, the check would previously use template arguments in a note, which would result in inconsistent or duplicate warnings (depending on how deduplication was done). This patch removes template arguments from the note. Modified: clang-tools-extra/trunk/clang-tidy/readability/ContainerSizeEmptyCheck.cpp clang-tools-extra/trunk/test/clang-tidy/readability-container-size-empty.cpp Modified: clang-tools-extra/trunk/clang-tidy/readability/ContainerSizeEmptyCheck.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/readability/ContainerSizeEmptyCheck.cpp?rev=347652&r1=347651&r2=347652&view=diff ============================================================================== --- clang-tools-extra/trunk/clang-tidy/readability/ContainerSizeEmptyCheck.cpp (original) +++ clang-tools-extra/trunk/clang-tidy/readability/ContainerSizeEmptyCheck.cpp Tue Nov 27 02:53:44 2018 @@ -213,6 +213,14 @@ void ContainerSizeEmptyCheck::check(cons } 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", Modified: clang-tools-extra/trunk/test/clang-tidy/readability-container-size-empty.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-tidy/readability-container-size-empty.cpp?rev=347652&r1=347651&r2=347652&view=diff ============================================================================== --- clang-tools-extra/trunk/test/clang-tidy/readability-container-size-empty.cpp (original) +++ clang-tools-extra/trunk/test/clang-tidy/readability-container-size-empty.cpp Tue Nov 27 02:53:44 2018 @@ -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); } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits