llvmbot wrote:

<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-clangd

Author: Quan Zhuo (quanzhuo)

<details>
<summary>Changes</summary>

SelectionTree attempts to skip nodes that don't intersect with the selection 
for performance. However, Attr nodes (like AlignedAttr) often have inaccurate 
source ranges (e.g. pointing to a single location).

Previously, canSafelySkipNode handled nodes that *have* attributes attached, 
but failed to account for the case where the node being visited *is* the 
attribute itself. This caused `alignas(WALDO)` to be skipped, breaking features 
like go-to-definition on WALDO.

This commit adds a check to ensure explicit Attr nodes are visited, fixing the 
issue.

Fixes https://github.com/clangd/clangd/issues/2502

---
Full diff: https://github.com/llvm/llvm-project/pull/174199.diff


2 Files Affected:

- (modified) clang-tools-extra/clangd/Selection.cpp (+5) 
- (modified) clang-tools-extra/clangd/unittests/SelectionTests.cpp (+5) 


``````````diff
diff --git a/clang-tools-extra/clangd/Selection.cpp 
b/clang-tools-extra/clangd/Selection.cpp
index faa00d20497fa..01f1470f7fac3 100644
--- a/clang-tools-extra/clangd/Selection.cpp
+++ b/clang-tools-extra/clangd/Selection.cpp
@@ -817,6 +817,11 @@ class SelectionVisitor : public 
RecursiveASTVisitor<SelectionVisitor> {
     if (llvm::any_of(getAttributes(N),
                      [](const Attr *A) { return !A->isImplicit(); }))
       return false;
+    // Attributes themselves also often have bad source ranges.
+    if (const auto *A = N.get<Attr>()) {
+      if (!A->isImplicit())
+        return false;
+    }
     if (!SelChecker.mayHit(S)) {
       dlog("{2}skip: {0} {1}", printNodeToString(N, PrintPolicy),
            S.printToString(SM), indent());
diff --git a/clang-tools-extra/clangd/unittests/SelectionTests.cpp 
b/clang-tools-extra/clangd/unittests/SelectionTests.cpp
index 63c0403ab2e70..5e897fae79df4 100644
--- a/clang-tools-extra/clangd/unittests/SelectionTests.cpp
+++ b/clang-tools-extra/clangd/unittests/SelectionTests.cpp
@@ -608,6 +608,11 @@ TEST(SelectionTest, CommonAncestor) {
         template <typename T> void g(D<[[^T]]> auto abc) {}
       )cpp",
        "TemplateTypeParmTypeLoc"},
+      {R"cpp(
+        const unsigned WALDO = 64;
+        struct alignas([[WA^LDO]]) foo {};
+      )cpp",
+       "DeclRefExpr"},
   };
 
   for (const Case &C : Cases) {

``````````

</details>


https://github.com/llvm/llvm-project/pull/174199
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to