[clang-tidy] Fix a false positive about C++17 deduced class template types in unused-using-decl check.

Reviewers: gribozavr2

Subscribers: xazax.hun, cfe-commits

Tags: #clang

Differential Revision: https://reviews.llvm.org/D73876
This commit is contained in:
Haojian Wu 2020-02-03 13:59:46 +01:00
parent 241c9a50b4
commit 7d4c23b349
2 changed files with 40 additions and 0 deletions

View File

@ -38,6 +38,13 @@ AST_POLYMORPHIC_MATCHER_P(
*Builder = std::move(Result);
return Matched;
}
AST_MATCHER_P(DeducedTemplateSpecializationType, refsToTemplatedDecl,
clang::ast_matchers::internal::Matcher<NamedDecl>, DeclMatcher) {
if (const auto *TD = Node.getTemplateName().getAsTemplateDecl())
return DeclMatcher.matches(*TD, Finder, Builder);
return false;
}
} // namespace
// A function that helps to tell whether a TargetDecl in a UsingDecl will be
@ -56,6 +63,9 @@ void UnusedUsingDeclsCheck::registerMatchers(MatchFinder *Finder) {
Finder->addMatcher(loc(enumType(DeclMatcher)), this);
Finder->addMatcher(loc(recordType(DeclMatcher)), this);
Finder->addMatcher(loc(templateSpecializationType(DeclMatcher)), this);
Finder->addMatcher(loc(deducedTemplateSpecializationType(
refsToTemplatedDecl(namedDecl().bind("used")))),
this);
Finder->addMatcher(declRefExpr().bind("used"), this);
Finder->addMatcher(callExpr(callee(unresolvedLookupExpr().bind("used"))),
this);

View File

@ -0,0 +1,30 @@
// RUN: %check_clang_tidy -std=c++17-or-later %s misc-unused-using-decls %t -- -- -fno-delayed-template-parsing -isystem %S/Inputs/
namespace ns {
template <typename T> class Foo {
public:
Foo(T);
};
// Deduction guide (CTAD)
template <typename T> Foo(T t) -> Foo<T>;
template <typename T> class Bar {
public:
Bar(T);
};
template <typename T> class Unused {};
} // namespace ns
using ns::Bar;
using ns::Foo;
using ns::Unused; // Unused
// CHECK-MESSAGES: :[[@LINE-1]]:11: warning: using decl 'Unused' is unused
// CHECK-FIXES: {{^}}// Unused
void f() {
Foo(123);
Bar(1);
}