summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHaojian Wu <hokein@google.com>2016-08-02 11:26:35 +0000
committerHaojian Wu <hokein@google.com>2016-08-02 11:26:35 +0000
commitda2a58dd0b261d6af2ecca61f549ab2bd8135ec6 (patch)
tree9a2f1bb9067241648e3642af0128bb096d7ab97c
parent00adc413702e0c7f1fef76ae2e3653b2c2b95b9c (diff)
downloadbcm5719-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
-rw-r--r--clang-tools-extra/clang-tidy/misc/UnusedUsingDeclsCheck.cpp20
-rw-r--r--clang-tools-extra/test/clang-tidy/Inputs/unused-using-decls.h11
-rw-r--r--clang-tools-extra/test/clang-tidy/misc-unused-using-decls.cpp21
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);
}
OpenPOWER on IntegriCloud