diff options
author | Haojian Wu <hokein@google.com> | 2016-08-02 11:26:35 +0000 |
---|---|---|
committer | Haojian Wu <hokein@google.com> | 2016-08-02 11:26:35 +0000 |
commit | da2a58dd0b261d6af2ecca61f549ab2bd8135ec6 (patch) | |
tree | 9a2f1bb9067241648e3642af0128bb096d7ab97c | |
parent | 00adc413702e0c7f1fef76ae2e3653b2c2b95b9c (diff) | |
download | bcm5719-llvm-da2a58dd0b261d6af2ecca61f549ab2bd8135ec6.tar.gz bcm5719-llvm-da2a58dd0b261d6af2ecca61f549ab2bd8135ec6.zip |
[clang-tidy] Fix an unused-using-decl false positive about template arguments in
function call expression.
Summary:
The check doesn't mark the template argument as used when the template
argument is a template.
Reviewers: djasper, alexfh
Subscribers: klimek, cfe-commits
Differential Revision: https://reviews.llvm.org/D22803
llvm-svn: 277444
3 files changed, 48 insertions, 4 deletions
diff --git a/clang-tools-extra/clang-tidy/misc/UnusedUsingDeclsCheck.cpp b/clang-tools-extra/clang-tidy/misc/UnusedUsingDeclsCheck.cpp index 8c9859c6792..3e4bb397dfc 100644 --- a/clang-tools-extra/clang-tidy/misc/UnusedUsingDeclsCheck.cpp +++ b/clang-tools-extra/clang-tidy/misc/UnusedUsingDeclsCheck.cpp @@ -37,6 +37,11 @@ void UnusedUsingDeclsCheck::registerMatchers(MatchFinder *Finder) { 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 @@ void UnusedUsingDeclsCheck::check(const MatchFinder::MatchResult &Result) { 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::check(const MatchFinder::MatchResult &Result) { } 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. diff --git a/clang-tools-extra/test/clang-tidy/Inputs/unused-using-decls.h b/clang-tools-extra/test/clang-tidy/Inputs/unused-using-decls.h new file mode 100644 index 00000000000..8245cb19feb --- /dev/null +++ b/clang-tools-extra/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(); + } +}; diff --git a/clang-tools-extra/test/clang-tidy/misc-unused-using-decls.cpp b/clang-tools-extra/test/clang-tidy/misc-unused-using-decls.cpp index 618a9f661f9..fec49496c2b 100644 --- a/clang-tools-extra/test/clang-tidy/misc-unused-using-decls.cpp +++ b/clang-tools-extra/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 @@ enum Color4 { Blue }; } // 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::Color2; using n::Color3; using n::Blue; +using ns::AA; +using ns::ff; + // ----- Usages ----- void f(B b); void g() { @@ -151,4 +165,9 @@ void g() { Color2 color2; int t1 = Color3::Yellow; int t2 = Blue; + + MyClass a; + int t3 = 0; + a.func1<AA>(&t3); + a.func2<int, ff>(t3); } |