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 @@ -90,8 +90,10 @@ ? HighlightingKind::StaticField : VD->isLocalVarDecl() ? HighlightingKind::LocalVariable : HighlightingKind::Variable; - if (isa(D)) - return HighlightingKind::Variable; + if (const auto *BD = dyn_cast(D)) + return BD->getDeclContext()->isFunctionOrMethod() + ? HighlightingKind::LocalVariable + : HighlightingKind::Variable; if (isa(D)) return HighlightingKind::Function; if (isa(D) || isa(D) || 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 @@ -515,13 +515,14 @@ $Class[[S]] *$Field[[Next]]; }; $Class[[S]] $Variable[[Global]][2] = {$Class[[S]](), $Class[[S]]()}; + auto [$Variable[[G1]], $Variable[[G2]]] = $Variable[[Global]]; void $Function[[f]]($Class[[S]] $Parameter[[P]]) { int $LocalVariable[[A]][2] = {1,2}; - auto [$Variable[[B1]], $Variable[[B2]]] = $LocalVariable[[A]]; - auto [$Variable[[G1]], $Variable[[G2]]] = $Variable[[Global]]; - $Class[[auto]] [$Variable[[P1]], $Variable[[P2]]] = $Parameter[[P]]; + auto [$LocalVariable[[B1]], $LocalVariable[[B2]]] = $LocalVariable[[A]]; + auto [$LocalVariable[[G1]], $LocalVariable[[G2]]] = $Variable[[Global]]; + $Class[[auto]] [$LocalVariable[[P1]], $LocalVariable[[P2]]] = $Parameter[[P]]; // Highlights references to BindingDecls. - $Variable[[B1]]++; + $LocalVariable[[B1]]++; } )cpp", R"cpp(