https://github.com/kadircet created https://github.com/llvm/llvm-project/pull/106430
We were reporting ambigious references from using declarations as user can be depending on different overloads of a function just because they are visible in the TU. This doesn't apply to records, or primary templates as declaration being referenced in such cases is unambigious, the ambiguity applies to specializations though. Hence this patch returns an explicit reference to record decls and primary templates of those. From 89694986accf28acb6605214daa72dfe313017dd Mon Sep 17 00:00:00 2001 From: Kadir Cetinkaya <kadir...@google.com> Date: Wed, 28 Aug 2024 20:30:08 +0200 Subject: [PATCH] [include-cleaner] Mark RecordDecls referenced in UsingDecls as explicit We were reporting ambigious references from using declarations as user can be depending on different overloads of a function just because they are visible in the TU. This doesn't apply to records, or primary templates as declaration being referenced in such cases is unambigious, the ambiguity applies to specializations though. Hence this patch returns an explicit reference to record decls and primary templates of those. --- clang-tools-extra/include-cleaner/lib/WalkAST.cpp | 2 +- .../include-cleaner/unittests/WalkASTTest.cpp | 11 ++++++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/clang-tools-extra/include-cleaner/lib/WalkAST.cpp b/clang-tools-extra/include-cleaner/lib/WalkAST.cpp index 598484d09712e5..5e6b862caf0d6c 100644 --- a/clang-tools-extra/include-cleaner/lib/WalkAST.cpp +++ b/clang-tools-extra/include-cleaner/lib/WalkAST.cpp @@ -203,7 +203,7 @@ class ASTWalker : public RecursiveASTVisitor<ASTWalker> { bool VisitUsingDecl(UsingDecl *UD) { for (const auto *Shadow : UD->shadows()) { auto *TD = Shadow->getTargetDecl(); - auto IsUsed = TD->isUsed() || TD->isReferenced(); + auto IsUsed = TD->isUsed() || TD->isReferenced() || !TD->getAsFunction(); report(UD->getLocation(), TD, IsUsed ? RefType::Explicit : RefType::Ambiguous); diff --git a/clang-tools-extra/include-cleaner/unittests/WalkASTTest.cpp b/clang-tools-extra/include-cleaner/unittests/WalkASTTest.cpp index 6c8eacbff1cea3..9286758cab081c 100644 --- a/clang-tools-extra/include-cleaner/unittests/WalkASTTest.cpp +++ b/clang-tools-extra/include-cleaner/unittests/WalkASTTest.cpp @@ -255,7 +255,7 @@ TEST(WalkAST, TemplateSpecializationsFromUsingDecl) { // Class templates testWalk(R"cpp( namespace ns { -template<class T> class $ambiguous^Z {}; // primary template +template<class T> class $explicit^Z {}; // primary template template<class T> class $ambiguous^Z<T*> {}; // partial specialization template<> class $ambiguous^Z<int> {}; // full specialization } @@ -265,7 +265,7 @@ template<> class $ambiguous^Z<int> {}; // full specialization // Var templates testWalk(R"cpp( namespace ns { -template<class T> T $ambiguous^foo; // primary template +template<class T> T $explicit^foo; // primary template template<class T> T $ambiguous^foo<T*>; // partial specialization template<> int* $ambiguous^foo<int>; // full specialization } @@ -335,7 +335,12 @@ TEST(WalkAST, Using) { testWalk(R"cpp( namespace ns { template<class T> - class $ambiguous^Y {}; + class $explicit^Y {}; + })cpp", + "using ns::^Y;"); + testWalk(R"cpp( + namespace ns { + class $explicit^Y {}; })cpp", "using ns::^Y;"); testWalk(R"cpp( _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits