[clang-tools-extra] [include-cleaner] Mark RecordDecls referenced in UsingDecls as explicit (PR #106430)
via cfe-commits
cfe-commits at lists.llvm.org
Wed Aug 28 11:34:08 PDT 2024
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang-tools-extra
Author: kadir çetinkaya (kadircet)
<details>
<summary>Changes</summary>
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.
---
Full diff: https://github.com/llvm/llvm-project/pull/106430.diff
2 Files Affected:
- (modified) clang-tools-extra/include-cleaner/lib/WalkAST.cpp (+1-1)
- (modified) clang-tools-extra/include-cleaner/unittests/WalkASTTest.cpp (+8-3)
``````````diff
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(
``````````
</details>
https://github.com/llvm/llvm-project/pull/106430
More information about the cfe-commits
mailing list