This revision was automatically updated to reflect the committed changes. Closed by commit rL269906: [clang-tidy] Fix a template function false positive in misc-unused-using… (authored by hokein).
Changed prior to commit: http://reviews.llvm.org/D20326?vs=57586&id=57591#toc Repository: rL LLVM http://reviews.llvm.org/D20326 Files: clang-tools-extra/trunk/clang-tidy/misc/UnusedUsingDeclsCheck.cpp 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 @@ -10,20 +10,29 @@ #include "UnusedUsingDeclsCheck.h" #include "clang/AST/ASTContext.h" #include "clang/ASTMatchers/ASTMatchFinder.h" +#include "clang/ASTMatchers/ASTMatchersInternal.h" #include "clang/Lex/Lexer.h" using namespace clang::ast_matchers; namespace clang { namespace tidy { namespace misc { +namespace { +// FIXME: Move this node matcher to ASTMatcher. +const internal::VariadicDynCastAllOfMatcher<Stmt, UnresolvedLookupExpr> + unresolvedLookupExpr; +} + void UnusedUsingDeclsCheck::registerMatchers(MatchFinder *Finder) { Finder->addMatcher(usingDecl(isExpansionInMainFile()).bind("using"), this); auto DeclMatcher = hasDeclaration(namedDecl().bind("used")); Finder->addMatcher(loc(recordType(DeclMatcher)), this); Finder->addMatcher(loc(templateSpecializationType(DeclMatcher)), this); Finder->addMatcher(declRefExpr().bind("used"), this); + Finder->addMatcher(callExpr(callee(unresolvedLookupExpr().bind("used"))), + this); } void UnusedUsingDeclsCheck::check(const MatchFinder::MatchResult &Result) { @@ -81,6 +90,13 @@ removeFromFoundDecls(VD); } } + // Check the uninstantiated template function usage. + if (const auto *ULE = Result.Nodes.getNodeAs<UnresolvedLookupExpr>("used")) { + for (const NamedDecl* ND : ULE->decls()) { + if (const auto *USD = dyn_cast<UsingShadowDecl>(ND)) + removeFromFoundDecls(USD->getTargetDecl()->getCanonicalDecl()); + } + } } void UnusedUsingDeclsCheck::removeFromFoundDecls(const Decl *D) { 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 @@ -16,6 +16,7 @@ public: static int ii; }; +template <typename T> class J {}; class Base { public: @@ -29,6 +30,7 @@ int UnusedFunc() { return 1; } template <typename T> int UsedTemplateFunc() { return 1; } template <typename T> int UnusedTemplateFunc() { return 1; } +template <typename T> int UsedInTemplateFunc() { return 1; } class ostream { public: @@ -70,6 +72,13 @@ using n::cout; using n::endl; +using n::UsedInTemplateFunc; +using n::J; +template <typename T> void Callee() { + J<T> j; + UsedInTemplateFunc<T>(); +} + #define DEFINE_INT(name) \ namespace INT { \ static const int _##name = 1; \
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 @@ -10,20 +10,29 @@ #include "UnusedUsingDeclsCheck.h" #include "clang/AST/ASTContext.h" #include "clang/ASTMatchers/ASTMatchFinder.h" +#include "clang/ASTMatchers/ASTMatchersInternal.h" #include "clang/Lex/Lexer.h" using namespace clang::ast_matchers; namespace clang { namespace tidy { namespace misc { +namespace { +// FIXME: Move this node matcher to ASTMatcher. +const internal::VariadicDynCastAllOfMatcher<Stmt, UnresolvedLookupExpr> + unresolvedLookupExpr; +} + void UnusedUsingDeclsCheck::registerMatchers(MatchFinder *Finder) { Finder->addMatcher(usingDecl(isExpansionInMainFile()).bind("using"), this); auto DeclMatcher = hasDeclaration(namedDecl().bind("used")); Finder->addMatcher(loc(recordType(DeclMatcher)), this); Finder->addMatcher(loc(templateSpecializationType(DeclMatcher)), this); Finder->addMatcher(declRefExpr().bind("used"), this); + Finder->addMatcher(callExpr(callee(unresolvedLookupExpr().bind("used"))), + this); } void UnusedUsingDeclsCheck::check(const MatchFinder::MatchResult &Result) { @@ -81,6 +90,13 @@ removeFromFoundDecls(VD); } } + // Check the uninstantiated template function usage. + if (const auto *ULE = Result.Nodes.getNodeAs<UnresolvedLookupExpr>("used")) { + for (const NamedDecl* ND : ULE->decls()) { + if (const auto *USD = dyn_cast<UsingShadowDecl>(ND)) + removeFromFoundDecls(USD->getTargetDecl()->getCanonicalDecl()); + } + } } void UnusedUsingDeclsCheck::removeFromFoundDecls(const Decl *D) { 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 @@ -16,6 +16,7 @@ public: static int ii; }; +template <typename T> class J {}; class Base { public: @@ -29,6 +30,7 @@ int UnusedFunc() { return 1; } template <typename T> int UsedTemplateFunc() { return 1; } template <typename T> int UnusedTemplateFunc() { return 1; } +template <typename T> int UsedInTemplateFunc() { return 1; } class ostream { public: @@ -70,6 +72,13 @@ using n::cout; using n::endl; +using n::UsedInTemplateFunc; +using n::J; +template <typename T> void Callee() { + J<T> j; + UsedInTemplateFunc<T>(); +} + #define DEFINE_INT(name) \ namespace INT { \ static const int _##name = 1; \
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits