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 @@ -42,6 +42,8 @@ anyOf(refersToTemplate(templateName().bind("used")), refersToDeclaration(functionDecl().bind("used"))))))), this); + Finder->addMatcher(loc(templateSpecializationType( + hasAnyTemplateArgument(templateArgument().bind("used")))), this); } void UnusedUsingDeclsCheck::check(const MatchFinder::MatchResult &Result) { @@ -91,6 +93,18 @@ return; } + if (const auto *Used = Result.Nodes.getNodeAs<TemplateArgument>("used")) { + // FIXME: Support non-type template parameters. + if (Used->getKind() == TemplateArgument::Template) { + if (const auto *TD = Used->getAsTemplate().getAsTemplateDecl()) + removeFromFoundDecls(TD); + } else if (Used->getKind() == TemplateArgument::Type) { + if (auto *RD = Used->getAsType()->getAsCXXRecordDecl()) + removeFromFoundDecls(RD); + } + return; + } + if (const auto *Used = Result.Nodes.getNodeAs<TemplateName>("used")) { removeFromFoundDecls(Used->getAsTemplateDecl()); return; 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 @@ -21,6 +21,16 @@ class G; class H; +template <typename T> class K {}; +template <template <typename> class S> +class L {}; + +template <typename T> class M {}; +class N {}; + +template <int T> class P {}; +const int Constant = 0; + class Base { public: void f(); @@ -150,6 +160,14 @@ using ns::AA; using ns::ff; +using n::K; + +using n::N; + +// FIXME: Currently non-type template arguments are not supported. +using n::Constant; +// CHECK-MESSAGES: :[[@LINE-1]]:10: warning: using decl 'Constant' is unused + // ----- Usages ----- void f(B b); void g() { @@ -170,4 +188,16 @@ int t3 = 0; a.func1<AA>(&t3); a.func2<int, ff>(t3); + + n::L<K> l; } + +template<class T> +void h(n::M<T>* t) {} +// n::N is used the explicit template instantiation. +template void h(n::M<N>* t); + +// Test on Non-type template arguments. +template <int T> +void i(n::P<T>* t) {} +template void i(n::P<Constant>* t);