[PATCH] D158515: [include-cleaner] Make handling of enum constants similar to members
Kadir Cetinkaya via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Tue Aug 22 08:56:10 PDT 2023
kadircet updated this revision to Diff 552391.
kadircet added a comment.
- Add test for using enums
- Drop implicit references from qualified names to their containers, as we should already have explicit references from the spelling of the qualifier.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D158515/new/
https://reviews.llvm.org/D158515
Files:
clang-tools-extra/include-cleaner/lib/WalkAST.cpp
clang-tools-extra/include-cleaner/unittests/WalkASTTest.cpp
Index: clang-tools-extra/include-cleaner/unittests/WalkASTTest.cpp
===================================================================
--- clang-tools-extra/include-cleaner/unittests/WalkASTTest.cpp
+++ clang-tools-extra/include-cleaner/unittests/WalkASTTest.cpp
@@ -114,7 +114,7 @@
testWalk("int $explicit^x;", "int y = ^x;");
testWalk("int $explicit^foo();", "int y = ^foo();");
testWalk("namespace ns { int $explicit^x; }", "int y = ns::^x;");
- testWalk("struct $implicit^S { static int x; };", "int y = S::^x;");
+ testWalk("struct S { static int x; };", "int y = S::^x;");
// Canonical declaration only.
testWalk("extern int $explicit^x; int x;", "int y = ^x;");
// Return type of `foo` isn't used.
@@ -309,6 +309,14 @@
namespace ns { using ::$explicit^Foo; }
template<> struct ns::Foo<int> {};)cpp",
"ns::^Foo<int> x;");
+ testWalk(R"cpp(
+ namespace ns { enum class foo { bar }; }
+ using ns::foo;)cpp",
+ "auto x = foo::^bar;");
+ testWalk(R"cpp(
+ namespace ns { enum foo { bar }; }
+ using ns::foo::$explicit^bar;)cpp",
+ "auto x = ^bar;");
}
TEST(WalkAST, Using) {
@@ -338,6 +346,8 @@
}
using ns::$explicit^Y;)cpp",
"^Y<int> x;");
+ testWalk("namespace ns { enum E {A}; } using enum ns::$explicit^E;",
+ "auto x = ^A;");
}
TEST(WalkAST, Namespaces) {
@@ -399,10 +409,10 @@
}
TEST(WalkAST, MemberExprs) {
- testWalk("struct $implicit^S { static int f; };", "void foo() { S::^f; }");
- testWalk("struct B { static int f; }; struct $implicit^S : B {};",
+ testWalk("struct S { static int f; };", "void foo() { S::^f; }");
+ testWalk("struct B { static int f; }; struct S : B {};",
"void foo() { S::^f; }");
- testWalk("struct B { static void f(); }; struct $implicit^S : B {};",
+ testWalk("struct B { static void f(); }; struct S : B {};",
"void foo() { S::^f; }");
testWalk("struct B { static void f(); }; ",
"struct S : B { void foo() { ^f(); } };");
Index: clang-tools-extra/include-cleaner/lib/WalkAST.cpp
===================================================================
--- clang-tools-extra/include-cleaner/lib/WalkAST.cpp
+++ clang-tools-extra/include-cleaner/lib/WalkAST.cpp
@@ -126,13 +126,22 @@
}
bool VisitDeclRefExpr(DeclRefExpr *DRE) {
- // Static class members are handled here, as they don't produce MemberExprs.
- if (DRE->getFoundDecl()->isCXXClassMember()) {
- if (auto *Qual = DRE->getQualifier())
- report(DRE->getLocation(), Qual->getAsRecordDecl(), RefType::Implicit);
- } else {
- report(DRE->getLocation(), DRE->getFoundDecl());
+ auto *FD = DRE->getFoundDecl();
+ // For refs to non-meber-like decls, use the found decl.
+ // For member-like decls, we should have a reference from the qualifier to
+ // the container decl instead, which is preferred as it'll handle
+ // aliases/exports properly.
+ if (!FD->isCXXClassMember() && !llvm::isa<EnumConstantDecl>(FD)) {
+ report(DRE->getLocation(), FD);
+ return true;
}
+ // If the ref is without a qualifier, and is a member, ignore it. As it is
+ // available in current context due to some other construct (e.g. base
+ // specifiers, using decls) that has to spell the name explicitly.
+ // If it's an enum constant, it must be due to prior decl. Report references
+ // to it instead.
+ if (llvm::isa<EnumConstantDecl>(FD) && !DRE->hasQualifier())
+ report(DRE->getLocation(), FD);
return true;
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D158515.552391.patch
Type: text/x-patch
Size: 3551 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20230822/e255627c/attachment-0001.bin>
More information about the cfe-commits
mailing list