diff --git a/clang-tools-extra/clangd/SemanticHighlighting.cpp b/clang-tools-extra/clangd/SemanticHighlighting.cpp --- a/clang-tools-extra/clangd/SemanticHighlighting.cpp +++ b/clang-tools-extra/clangd/SemanticHighlighting.cpp @@ -514,8 +514,15 @@ return true; if (auto K = kindForType(AT->getDeducedType().getTypePtrOrNull(), H.getResolver())) { - auto &Tok = H.addToken(D->getTypeSpecStartLoc(), *K) - .addModifier(HighlightingModifier::Deduced); + SourceLocation StartLoc = D->getTypeSpecStartLoc(); + // The AutoType may not have a corresponding token, e.g. in the case of + // init-captures, so there's nothing to color. + // Detect this case by checking if the type specifier's location + // is the same as the location of the declared name itself. + if (StartLoc == D->getLocation()) + return true; + auto &Tok = + H.addToken(StartLoc, *K).addModifier(HighlightingModifier::Deduced); const Type *Deduced = AT->getDeducedType().getTypePtrOrNull(); if (auto Mod = scopeModifier(Deduced)) Tok.addModifier(*Mod); diff --git a/clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp b/clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp --- a/clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp +++ b/clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp @@ -729,6 +729,14 @@ } }; )cpp", + // init-captures + R"cpp( + void $Function_decl[[foo]]() { + int $LocalVariable_decl[[a]], $LocalVariable_decl[[b]]; + [ $LocalVariable_decl[[c]] = $LocalVariable[[a]], + $LocalVariable_decl[[d]]($LocalVariable[[b]]) ]() {}(); + } + )cpp", }; for (const auto &TestCase : TestCases) // Mask off scope modifiers to keep the tests manageable. @@ -797,7 +805,7 @@ )cpp", R"cpp( // Lambdas are considered functions, not classes. - auto $Variable_fileScope[[x]] = [m(42)] { // FIXME: annotate capture + auto $Variable_fileScope[[x]] = [$LocalVariable_functionScope[[m]](42)] { return $LocalVariable_functionScope[[m]]; }; )cpp",