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 @@ -737,8 +737,10 @@ } bool VisitAutoTypeLoc(AutoTypeLoc L) { - if (L.isConstrained()) + if (L.isConstrained()) { H.addAngleBracketTokens(L.getLAngleLoc(), L.getRAngleLoc()); + H.addToken(L.getConceptNameInfo().getLoc(), HighlightingKind::Concept); + } return true; } @@ -960,6 +962,11 @@ // in both it and the token for the decl being dropped due to conflict. if (StartLoc == D->getLocation()) return true; + + if (auto *TSI = D->getTypeSourceInfo()) { + StartLoc = TSI->getTypeLoc().getContainedAutoTypeLoc().getNameLoc(); + } + auto &Tok = H.addToken(StartLoc, *K).addModifier(HighlightingModifier::Deduced); const Type *Deduced = AT->getDeducedType().getTypePtrOrNull(); 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 @@ -648,6 +648,15 @@ void $Function_def[[bar]]($TemplateParameter[[T]] $Parameter_def[[F]]) { $Parameter[[F]].$Unknown_dependentName[[foo]](); } + + struct $Class_def[[F]] { + void $Method_def[[foo]]() {}; + }; + $Concept[[Fooable]] $Class_deduced[[auto]] $Variable_def[[f]] = $Class[[F]](); + + void $Function_def[[Bar]]($Concept[[Fooable]] $TemplateParameter[[auto]] $Parameter_def[[x]]) {} + + template$Bracket[[<]]$Concept[[Fooable]] auto $TemplateParameter_def_readonly[[x]]$Bracket[[>]] void $Function_def[[Boo]]() {} )cpp", // Dependent template name R"cpp(