[clang-tools-extra] [clangd] fix crashes in SemanticHighlighting on NTTP typed `decltype(constexpr-auto-variable)` (PR #207323)
via cfe-commits
cfe-commits at lists.llvm.org
Thu Jul 2 22:17:10 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clangd
Author: ingoneuse
<details>
<summary>Changes</summary>
fixes #<!-- -->207139
- additional null check in `VisitDeclaratorDecl` for this edge case
- regression test
---
Full diff: https://github.com/llvm/llvm-project/pull/207323.diff
2 Files Affected:
- (modified) clang-tools-extra/clangd/SemanticHighlighting.cpp (+4-2)
- (modified) clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp (+8-3)
``````````diff
diff --git a/clang-tools-extra/clangd/SemanticHighlighting.cpp b/clang-tools-extra/clangd/SemanticHighlighting.cpp
index d1ed3ea9bc88a..5d9336fa6e53d 100644
--- a/clang-tools-extra/clangd/SemanticHighlighting.cpp
+++ b/clang-tools-extra/clangd/SemanticHighlighting.cpp
@@ -833,8 +833,10 @@ class CollectExtraHighlightings
auto *TSI = D->getTypeSourceInfo();
if (!TSI)
return true;
- SourceLocation StartLoc =
- TSI->getTypeLoc().getContainedAutoTypeLoc().getNameLoc();
+ auto ATL = TSI->getTypeLoc().getContainedAutoTypeLoc();
+ if (!ATL)
+ return true;
+ SourceLocation StartLoc = ATL.getNameLoc();
// The AutoType may not have a corresponding token, e.g. in the case of
// init-captures. In this case, StartLoc overlaps with the location
// of the decl itself, and producing a token for the type here would result
diff --git a/clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp b/clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp
index f8b7c242be9ff..a7ebd146c297b 100644
--- a/clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp
+++ b/clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp
@@ -1164,6 +1164,10 @@ TEST(SemanticHighlighting, NoCrash) {
template < template <> class a > using b = a<>; // error-ok
template <class c>
using e = b<c::template d>
+ )cpp",
+ R"cpp(
+ constexpr auto v = 0;
+ template <decltype(v) t> class c {};
)cpp"};
for (const auto &TestCase : TestCases) {
TestTU TU;
@@ -1230,11 +1234,12 @@ TEST(SemanticHighlighting, ScopeModifiers) {
std::vector<HighlightingToken> tokens(llvm::StringRef MarkedText) {
Annotations A(MarkedText);
std::vector<HighlightingToken> Results;
- for (const Range& R : A.ranges())
+ for (const Range &R : A.ranges())
Results.push_back({HighlightingKind::Variable, 0, R});
- for (unsigned I = 0; I < static_cast<unsigned>(HighlightingKind::LastKind); ++I) {
+ for (unsigned I = 0; I < static_cast<unsigned>(HighlightingKind::LastKind);
+ ++I) {
HighlightingKind Kind = static_cast<HighlightingKind>(I);
- for (const Range& R : A.ranges(llvm::to_string(Kind)))
+ for (const Range &R : A.ranges(llvm::to_string(Kind)))
Results.push_back({Kind, 0, R});
}
llvm::sort(Results);
``````````
</details>
https://github.com/llvm/llvm-project/pull/207323
More information about the cfe-commits
mailing list