This revision was automatically updated to reflect the committed changes. hokein marked an inline comment as done. Closed by commit rL277444: [clang-tidy] Fix an unused-using-decl false positive about template arguments in (authored by hokein).
Changed prior to commit: https://reviews.llvm.org/D22803?vs=66131&id=66457#toc Repository: rL LLVM https://reviews.llvm.org/D22803 Files: clang-tools-extra/trunk/clang-tidy/misc/UnusedUsingDeclsCheck.cpp clang-tools-extra/trunk/test/clang-tidy/Inputs/unused-using-decls.h clang-tools-extra/trunk/test/clang-tidy/misc-unused-using-decls.cpp
Index: clang-tools-extra/trunk/clang-tidy/misc/UnusedUsingDeclsCheck.cpp =================================================================== --- clang-tools-extra/trunk/clang-tidy/misc/UnusedUsingDeclsCheck.cpp +++ clang-tools-extra/trunk/clang-tidy/misc/UnusedUsingDeclsCheck.cpp @@ -37,6 +37,11 @@ Finder->addMatcher(declRefExpr().bind("used"), this); Finder->addMatcher(callExpr(callee(unresolvedLookupExpr().bind("used"))), this); + Finder->addMatcher( + callExpr(hasDeclaration(functionDecl(hasAnyTemplateArgument( + anyOf(refersToTemplate(templateName().bind("used")), + refersToDeclaration(functionDecl().bind("used"))))))), + this); } void UnusedUsingDeclsCheck::check(const MatchFinder::MatchResult &Result) { @@ -71,20 +76,27 @@ Contexts.push_back(Context); return; } - // Mark using declarations as used by setting FoundDecls' value to zero. As // the AST is walked in order, usages are only marked after a the // corresponding using declaration has been found. // FIXME: This currently doesn't look at whether the type reference is // actually found with the help of the using declaration. if (const auto *Used = Result.Nodes.getNodeAs<NamedDecl>("used")) { - if (const auto *Specialization = - dyn_cast<ClassTemplateSpecializationDecl>(Used)) + if (const auto *FD = dyn_cast<FunctionDecl>(Used)) { + removeFromFoundDecls(FD->getPrimaryTemplate()); + } else if (const auto *Specialization = + dyn_cast<ClassTemplateSpecializationDecl>(Used)) { Used = Specialization->getSpecializedTemplate(); + } removeFromFoundDecls(Used); return; } + if (const auto *Used = Result.Nodes.getNodeAs<TemplateName>("used")) { + removeFromFoundDecls(Used->getAsTemplateDecl()); + return; + } + if (const auto *DRE = Result.Nodes.getNodeAs<DeclRefExpr>("used")) { if (const auto *FD = dyn_cast<FunctionDecl>(DRE->getDecl())) { if (const auto *FDT = FD->getPrimaryTemplate()) @@ -109,6 +121,8 @@ } void UnusedUsingDeclsCheck::removeFromFoundDecls(const Decl *D) { + if (!D) + return; // FIXME: Currently, we don't handle the using-decls being used in different // scopes (such as different namespaces, different functions). Instead of // giving an incorrect message, we mark all of them as used. Index: clang-tools-extra/trunk/test/clang-tidy/Inputs/unused-using-decls.h =================================================================== --- clang-tools-extra/trunk/test/clang-tidy/Inputs/unused-using-decls.h +++ clang-tools-extra/trunk/test/clang-tidy/Inputs/unused-using-decls.h @@ -0,0 +1,11 @@ +class MyClass { +public: + template <template <typename> class S, typename T> + S<T> *func1(T *a) { + return new S<T>(); + } + template <typename T, T (*S)()> + void func2(T a) { + S(); + } +}; Index: clang-tools-extra/trunk/test/clang-tidy/misc-unused-using-decls.cpp =================================================================== --- clang-tools-extra/trunk/test/clang-tidy/misc-unused-using-decls.cpp +++ clang-tools-extra/trunk/test/clang-tidy/misc-unused-using-decls.cpp @@ -1,4 +1,5 @@ -// RUN: %check_clang_tidy %s misc-unused-using-decls %t -- -- -fno-delayed-template-parsing +// RUN: %check_clang_tidy %s misc-unused-using-decls %t -- -- -fno-delayed-template-parsing -isystem %S/Inputs/ + // ----- Definitions ----- template <typename T> class vector {}; @@ -54,6 +55,16 @@ } // namespace n +#include "unused-using-decls.h" +namespace ns { +template <typename T> +class AA { + T t; +}; +template <typename T> +T ff() { T t; return t; } +} // namespace ns + // ----- Using declarations ----- // eol-comments aren't removed (yet) using n::A; // A @@ -136,6 +147,9 @@ using n::Color3; using n::Blue; +using ns::AA; +using ns::ff; + // ----- Usages ----- void f(B b); void g() { @@ -151,4 +165,9 @@ Color2 color2; int t1 = Color3::Yellow; int t2 = Blue; + + MyClass a; + int t3 = 0; + a.func1<AA>(&t3); + a.func2<int, ff>(t3); }
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits