forked from OSchip/llvm-project
[clang-tidy] Fix template agrument false positives in unused-using-decls.
Summary: * Fix a false postive when an using class is used in an explicit template instantiation. * Fix a false postive when an using template class is used as template argument. Reviewers: aaron.ballman Subscribers: cfe-commits Differential Revision: https://reviews.llvm.org/D25437 llvm-svn: 283879
This commit is contained in:
parent
9609f3d6c7
commit
09c8d2e19f
|
@ -42,6 +42,8 @@ void UnusedUsingDeclsCheck::registerMatchers(MatchFinder *Finder) {
|
|||
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 @@ void UnusedUsingDeclsCheck::check(const MatchFinder::MatchResult &Result) {
|
|||
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;
|
||||
|
|
|
@ -21,6 +21,16 @@ template <typename T> class J {};
|
|||
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 n::Blue;
|
|||
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 @@ void g() {
|
|||
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);
|
||||
|
|
Loading…
Reference in New Issue