[PATCH] D152345: [include-cleaner] Report all specializations if the primary template is introduced by a using-decl.
Kadir Cetinkaya via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Wed Jun 7 01:26:53 PDT 2023
kadircet accepted this revision.
kadircet added a comment.
This revision is now accepted and ready to land.
thanks!
================
Comment at: clang-tools-extra/include-cleaner/lib/WalkAST.cpp:176
+ void reportSpecializations(SourceLocation Loc, NamedDecl *ND) {
+ if (const auto *TD = dyn_cast<TemplateDeclType>(ND)) {
+ for (auto *Spec : TD->specializations())
----------------
nit: prefer early exit
================
Comment at: clang-tools-extra/include-cleaner/lib/WalkAST.cpp:176
+ void reportSpecializations(SourceLocation Loc, NamedDecl *ND) {
+ if (const auto *TD = dyn_cast<TemplateDeclType>(ND)) {
+ for (auto *Spec : TD->specializations())
----------------
kadircet wrote:
> nit: prefer early exit
s/dyn_cast/llvm::dyn_cast
================
Comment at: clang-tools-extra/include-cleaner/lib/WalkAST.cpp:179
+ report(Loc, Spec, RefType::Ambiguous);
+ SmallVector<ParitialDeclType *> PartialSpecializations;
+ TD->getPartialSpecializations(PartialSpecializations);
----------------
s/SmallVector/llvm::SmallVector
================
Comment at: clang-tools-extra/include-cleaner/lib/WalkAST.cpp:202
+ UD->getLocation(), TD);
+ if (const auto *FTD = dyn_cast<FunctionTemplateDecl>(TD))
+ for (auto *Spec : FTD->specializations())
----------------
s/dyn_cast/llvm::dyn_cast
================
Comment at: clang-tools-extra/include-cleaner/unittests/WalkASTTest.cpp:257-272
+ testWalk(R"cpp(
+namespace ns {
+template<class T1, class T2> class $ambiguous^Z {}; // primary template
+template<class T> class $ambiguous^Z<T, T*> {}; // partial specialization
+template<class T> class $ambiguous^Z<T, T&> {}; // partial specialization
+}
+ )cpp",
----------------
i think we can merge these into a single test with something like:
```
namespace ns {
template <typename T> struct Z {};
template <typename T> struct Z<T*> {};
template <> struct Z<int> {};
}
using ns::Z; // uses all 3.
```
same applies to var template tests.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D152345/new/
https://reviews.llvm.org/D152345
More information about the cfe-commits
mailing list