[PATCH] D135506: [clangd] FindTarget: UsingEnumDecl is not an alias
Sam McCall via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Sat Oct 8 10:30:58 PDT 2022
This revision was automatically updated to reflect the committed changes.
Closed by commit rG2bb34cc462ff: [clangd] FindTarget: UsingEnumDecl is not an alias (authored by sammccall).
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D135506/new/
https://reviews.llvm.org/D135506
Files:
clang-tools-extra/clangd/FindTarget.cpp
clang-tools-extra/clangd/unittests/FindTargetTests.cpp
Index: clang-tools-extra/clangd/unittests/FindTargetTests.cpp
===================================================================
--- clang-tools-extra/clangd/unittests/FindTargetTests.cpp
+++ clang-tools-extra/clangd/unittests/FindTargetTests.cpp
@@ -279,6 +279,21 @@
)cpp";
EXPECT_DECLS("UnresolvedUsingTypeLoc",
{"using typename Foo<T>::foo", Rel::Alias});
+
+ // Using enum.
+ Flags.push_back("-std=c++20");
+ Code = R"cpp(
+ namespace ns { enum class A { X }; }
+ [[using enum ns::A]];
+ )cpp";
+ EXPECT_DECLS("UsingEnumDecl", "enum class A : int");
+
+ Code = R"cpp(
+ namespace ns { enum class A { X }; }
+ using enum ns::A;
+ auto m = [[X]];
+ )cpp";
+ EXPECT_DECLS("DeclRefExpr", "X");
}
TEST_F(TargetDeclTest, BaseSpecifier) {
Index: clang-tools-extra/clangd/FindTarget.cpp
===================================================================
--- clang-tools-extra/clangd/FindTarget.cpp
+++ clang-tools-extra/clangd/FindTarget.cpp
@@ -189,8 +189,8 @@
add(S->getUnderlyingDecl(), Flags);
Flags |= Rel::Alias; // continue with the alias.
} else if (const UsingEnumDecl *UED = dyn_cast<UsingEnumDecl>(D)) {
- add(UED->getEnumDecl(), Flags);
- Flags |= Rel::Alias; // continue with the alias.
+ // UsingEnumDecl is not an alias at all, just a reference.
+ D = UED->getEnumDecl();
} else if (const auto *NAD = dyn_cast<NamespaceAliasDecl>(D)) {
add(NAD->getUnderlyingDecl(), Flags | Rel::Underlying);
Flags |= Rel::Alias; // continue with the alias
@@ -207,9 +207,12 @@
// templates.
Flags |= Rel::Alias;
} else if (const UsingShadowDecl *USD = dyn_cast<UsingShadowDecl>(D)) {
- // Include the Introducing decl, but don't traverse it. This may end up
- // including *all* shadows, which we don't want.
- report(USD->getIntroducer(), Flags | Rel::Alias);
+ // Include the introducing UsingDecl, but don't traverse it. This may end
+ // up including *all* shadows, which we don't want.
+ // Don't apply this logic to UsingEnumDecl, which can't easily be
+ // conflated with the aliases it introduces.
+ if (llvm::isa<UsingDecl>(USD->getIntroducer()))
+ report(USD->getIntroducer(), Flags | Rel::Alias);
// Shadow decls are synthetic and not themselves interesting.
// Record the underlying decl instead, if allowed.
D = USD->getTargetDecl();
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D135506.466300.patch
Type: text/x-patch
Size: 2440 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20221008/d9f44d73/attachment.bin>
More information about the cfe-commits
mailing list