diff --git a/clang-tools-extra/clangd/FindTarget.cpp b/clang-tools-extra/clangd/FindTarget.cpp --- a/clang-tools-extra/clangd/FindTarget.cpp +++ b/clang-tools-extra/clangd/FindTarget.cpp @@ -194,6 +194,9 @@ for (auto *D : OE->decls()) Outer.add(D, Flags); } + void VisitSizeOfPackExpr(const SizeOfPackExpr *SE) { + Outer.add(SE->getPack(), Flags); + } void VisitCXXConstructExpr(const CXXConstructExpr *CCE) { Outer.add(CCE->getConstructor(), Flags); } @@ -491,6 +494,13 @@ llvm::SmallVector( E->decls().begin(), E->decls().end())}); } + + void VisitSizeOfPackExpr(const SizeOfPackExpr *E) { + Refs.push_back(ReferenceLoc{NestedNameSpecifierLoc(), + E->getPackLoc(), + /*IsDecl=*/false, + {E->getPack()}}); + } }; Visitor V; diff --git a/clang-tools-extra/clangd/unittests/FindTargetTests.cpp b/clang-tools-extra/clangd/unittests/FindTargetTests.cpp --- a/clang-tools-extra/clangd/unittests/FindTargetTests.cpp +++ b/clang-tools-extra/clangd/unittests/FindTargetTests.cpp @@ -260,6 +260,15 @@ )cpp"; // FIXME: deduced type missing in AST. https://llvm.org/PR42914 EXPECT_DECLS("AutoTypeLoc"); + + Code = R"cpp( + template + struct S { + static const int size = sizeof...([[E]]); + }; + )cpp"; + // FIXME: We don't do a good job printing TemplateTypeParmDecls, apparently! + EXPECT_DECLS("SizeOfPackExpr", ""); } TEST_F(TargetDeclTest, ClassTemplate) { 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 @@ -625,6 +625,13 @@ $InactiveCode[[]] #else int $Variable[[Active2]]; #endif + )cpp", + // Argument to 'sizeof...' + R"cpp( + template + struct $Class[[TupleSize]] { + static const int $StaticField[[size]] = sizeof...($TemplateParameter[[Elements]]); + }; )cpp"}; for (const auto &TestCase : TestCases) { checkHighlightings(TestCase);