[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:16:20 PDT 2026
https://github.com/ingoneuse created https://github.com/llvm/llvm-project/pull/207323
fixes #207139
- additional null check in `VisitDeclaratorDecl` for this edge case
- regression test
>From 04cabaf5f10f4a8a4e3dc8798bf72b7a09d0bf98 Mon Sep 17 00:00:00 2001
From: Ingo Neuse <ingo.neuse at sap.com>
Date: Fri, 3 Jul 2026 05:04:55 +0000
Subject: [PATCH 1/2] [clangd] formatting SemanticHighlightingTests.cpp
---
.../clangd/unittests/SemanticHighlightingTests.cpp | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp b/clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp
index f8b7c242be9ff..2d90446647cee 100644
--- a/clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp
+++ b/clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp
@@ -1230,11 +1230,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);
>From b22bfb07ca09869b31db6651dc44f5afcbe61c6b Mon Sep 17 00:00:00 2001
From: Ingo Neuse <ingo.neuse at sap.com>
Date: Fri, 3 Jul 2026 05:05:11 +0000
Subject: [PATCH 2/2] [clangd] fix crashes in SemanticHighlighting on NTTP
typed decltype(constexpr-auto-variable)
---
clang-tools-extra/clangd/SemanticHighlighting.cpp | 6 ++++--
.../clangd/unittests/SemanticHighlightingTests.cpp | 4 ++++
2 files changed, 8 insertions(+), 2 deletions(-)
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 2d90446647cee..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;
More information about the cfe-commits
mailing list