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 @@ -642,6 +642,11 @@ return RecursiveASTVisitor::TraverseNestedNameSpecifierLoc(L); } + bool TraverseConstructorInitializer(CXXCtorInitializer *Init) { + visitNode(DynTypedNode::create(*Init)); + return RecursiveASTVisitor::TraverseConstructorInitializer(Init); + } + private: /// Obtain information about a reference directly defined in \p N. Does not /// recurse into child nodes, e.g. do not expect references for constructor 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 @@ -812,6 +812,7 @@ "1: targets = {func}\n" "2: targets = {w}, decl\n" "3: targets = {FuncParam}\n"}, + // declaration references. {R"cpp( namespace ns {} class S {}; @@ -835,6 +836,19 @@ "8: targets = {INT2}, decl\n" "9: targets = {NS}, decl\n" "10: targets = {ns}\n"}, + // cxx constructor initializer. + {R"cpp( + void foo() { + class $0^X { + int $1^abc; + $2^X(): $3^abc() {} + }; + } + )cpp", + "0: targets = {X}, decl\n" + "1: targets = {foo()::X::abc}, decl\n" + "2: targets = {foo()::X::X}, decl\n" + "3: targets = {foo()::X::abc}\n"} }; for (const auto &C : Cases) {