[clang-tools-extra] [clangd][HLSL] Prevent RootSignature internal identifier leak on hover (PR #214955)
Maria Fernanda GuimarĂ£es via cfe-commits
cfe-commits at lists.llvm.org
Fri Aug 14 11:06:31 PDT 2026
https://github.com/mafeguimaraes updated https://github.com/llvm/llvm-project/pull/214955
>From 18797844e4ecb765fc11c3e2a711893105f00d02 Mon Sep 17 00:00:00 2001
From: Maria Fernanda Guimaraes <mariafefe201 at gmail.com>
Date: Sat, 8 Aug 2026 10:55:44 +0000
Subject: [PATCH 1/3] Prevent RootSignature internal identifier leak on hover
---
clang-tools-extra/clangd/Hover.cpp | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/clang-tools-extra/clangd/Hover.cpp b/clang-tools-extra/clangd/Hover.cpp
index a2f8b6418833d..0d6aa8cea9d17 100644
--- a/clang-tools-extra/clangd/Hover.cpp
+++ b/clang-tools-extra/clangd/Hover.cpp
@@ -1013,6 +1013,13 @@ std::optional<HoverInfo> getHoverContents(const SelectionTree::Node *N,
// Generates hover info for attributes.
std::optional<HoverInfo> getHoverContents(const Attr *A, ParsedAST &AST) {
HoverInfo HI;
+
+ if (const auto *RS = llvm::dyn_cast<RootSignatureAttr>(A)) {
+ HI.Name = "RootSignature";
+ HI.Documentation = Attr::getDocumentation(A->getKind()).str();
+ return HI;
+ }
+
HI.Name = A->getSpelling();
if (A->hasScope())
HI.LocalScope = A->getScopeName()->getName().str();
>From 7c13a79f60fe42ce0a6c697a78521e5b9ca4676d Mon Sep 17 00:00:00 2001
From: Maria Fernanda Guimaraes <mariafefe201 at gmail.com>
Date: Sat, 8 Aug 2026 11:13:05 +0000
Subject: [PATCH 2/3] Add hover test for RootSignature attribute
---
clang-tools-extra/clangd/Hover.cpp | 2 +-
.../clangd/unittests/HoverTests.cpp | 16 ++++++++++++++++
2 files changed, 17 insertions(+), 1 deletion(-)
diff --git a/clang-tools-extra/clangd/Hover.cpp b/clang-tools-extra/clangd/Hover.cpp
index 0d6aa8cea9d17..3f96bffff298d 100644
--- a/clang-tools-extra/clangd/Hover.cpp
+++ b/clang-tools-extra/clangd/Hover.cpp
@@ -1014,7 +1014,7 @@ std::optional<HoverInfo> getHoverContents(const SelectionTree::Node *N,
std::optional<HoverInfo> getHoverContents(const Attr *A, ParsedAST &AST) {
HoverInfo HI;
- if (const auto *RS = llvm::dyn_cast<RootSignatureAttr>(A)) {
+ if (llvm::isa<RootSignatureAttr>(A)) {
HI.Name = "RootSignature";
HI.Documentation = Attr::getDocumentation(A->getKind()).str();
return HI;
diff --git a/clang-tools-extra/clangd/unittests/HoverTests.cpp b/clang-tools-extra/clangd/unittests/HoverTests.cpp
index 02ce48c6dca95..3ae86a4b039f4 100644
--- a/clang-tools-extra/clangd/unittests/HoverTests.cpp
+++ b/clang-tools-extra/clangd/unittests/HoverTests.cpp
@@ -5431,6 +5431,22 @@ TEST(Hover, HLSLRegisterAttributeRange) {
}
}
+TEST(Hover, HLSLRootSignature) {
+ Annotations T(R"hlsl(
+ #define RS_CBV "CBV(b0)"
+ [^RootSignature(RS_CBV)]
+ void CS_ValidCBV() {}
+ )hlsl");
+
+ TestTU TU = TestTU::withCode(T.code());
+ configureHLSL(TU);
+ auto AST = TU.build();
+ auto H = getHover(AST, T.point(), format::getLLVMStyle(), nullptr);
+ ASSERT_TRUE(H) << "Hover should have been returned for RootSignature!";
+ EXPECT_EQ(H->Name, "RootSignature");
+ EXPECT_EQ(H->Definition, "");
+}
+
} // namespace
} // namespace clangd
} // namespace clang
>From 3166490173e170d22c2316930484b2a4c7069160 Mon Sep 17 00:00:00 2001
From: Maria Fernanda Guimaraes <mariafefe201 at gmail.com>
Date: Fri, 14 Aug 2026 18:06:14 +0000
Subject: [PATCH 3/3] Add HLSL language check and use custom test markers
---
clang-tools-extra/clangd/Hover.cpp | 4 +++-
clang-tools-extra/clangd/unittests/HoverTests.cpp | 13 +++++++------
2 files changed, 10 insertions(+), 7 deletions(-)
diff --git a/clang-tools-extra/clangd/Hover.cpp b/clang-tools-extra/clangd/Hover.cpp
index 3f96bffff298d..32612ef6c5431 100644
--- a/clang-tools-extra/clangd/Hover.cpp
+++ b/clang-tools-extra/clangd/Hover.cpp
@@ -1014,7 +1014,9 @@ std::optional<HoverInfo> getHoverContents(const SelectionTree::Node *N,
std::optional<HoverInfo> getHoverContents(const Attr *A, ParsedAST &AST) {
HoverInfo HI;
- if (llvm::isa<RootSignatureAttr>(A)) {
+ if (AST.getLangOpts().HLSL && llvm::isa<RootSignatureAttr>(A)) {
+ // We do not use pretty print here because it would expose the internal
+ // string/macro representation instead of the original source attribute.
HI.Name = "RootSignature";
HI.Documentation = Attr::getDocumentation(A->getKind()).str();
return HI;
diff --git a/clang-tools-extra/clangd/unittests/HoverTests.cpp b/clang-tools-extra/clangd/unittests/HoverTests.cpp
index 3ae86a4b039f4..797c06b2bf260 100644
--- a/clang-tools-extra/clangd/unittests/HoverTests.cpp
+++ b/clang-tools-extra/clangd/unittests/HoverTests.cpp
@@ -5432,11 +5432,13 @@ TEST(Hover, HLSLRegisterAttributeRange) {
}
TEST(Hover, HLSLRootSignature) {
- Annotations T(R"hlsl(
- #define RS_CBV "CBV(b0)"
- [^RootSignature(RS_CBV)]
- void CS_ValidCBV() {}
- )hlsl");
+ Annotations T(
+ R"hlsl(
+ #define RS_CBV "CBV(b0)"
+ [^RootSignature(RS_CBV)]
+ void main() {}
+ )hlsl",
+ Annotations::Markers().setRangeBegin("{{").setRangeEnd("}}"));
TestTU TU = TestTU::withCode(T.code());
configureHLSL(TU);
@@ -5444,7 +5446,6 @@ TEST(Hover, HLSLRootSignature) {
auto H = getHover(AST, T.point(), format::getLLVMStyle(), nullptr);
ASSERT_TRUE(H) << "Hover should have been returned for RootSignature!";
EXPECT_EQ(H->Name, "RootSignature");
- EXPECT_EQ(H->Definition, "");
}
} // namespace
More information about the cfe-commits
mailing list