Author: Haojian Wu Date: 2021-02-11T11:08:26+01:00 New Revision: 6c47eafb3973a8e3f7455c9655ed666883e7b513
URL: https://github.com/llvm/llvm-project/commit/6c47eafb3973a8e3f7455c9655ed666883e7b513 DIFF: https://github.com/llvm/llvm-project/commit/6c47eafb3973a8e3f7455c9655ed666883e7b513.diff LOG: [clang][index] report references from unreslovedLookupExpr. Fix https://github.com/clangd/clangd/issues/675 Differential Revision: https://reviews.llvm.org/D96262 Added: Modified: clang-tools-extra/clangd/unittests/XRefsTests.cpp clang/lib/Index/IndexBody.cpp clang/test/Index/Core/index-dependent-source.cpp Removed: ################################################################################ diff --git a/clang-tools-extra/clangd/unittests/XRefsTests.cpp b/clang-tools-extra/clangd/unittests/XRefsTests.cpp index a7715900ab97..9d77e0fb291a 100644 --- a/clang-tools-extra/clangd/unittests/XRefsTests.cpp +++ b/clang-tools-extra/clangd/unittests/XRefsTests.cpp @@ -1863,6 +1863,26 @@ TEST(FindReferences, WithinAST) { Vector<int> x2; Vector<double> y; )cpp", + R"cpp(// Dependent code + template <typename T> void $decl[[foo]](T t); + template <typename T> void bar(T t) { [[foo]](t); } // foo in bar is uninstantiated. + void baz(int x) { [[f^oo]](x); } + )cpp", + R"cpp( + namespace ns { + struct S{}; + void $decl[[foo]](S s); + } // namespace ns + template <typename T> void foo(T t); + // FIXME: Maybe report this foo as a ref to ns::foo (because of ADL) + // when bar<ns::S> is instantiated? + template <typename T> void bar(T t) { foo(t); } + void baz(int x) { + ns::S s; + bar<ns::S>(s); + [[f^oo]](s); + } + )cpp", }; for (const char *Test : Tests) checkFindRefs(Test); diff --git a/clang/lib/Index/IndexBody.cpp b/clang/lib/Index/IndexBody.cpp index e4944fd0fc3b..7279e3b53c81 100644 --- a/clang/lib/Index/IndexBody.cpp +++ b/clang/lib/Index/IndexBody.cpp @@ -466,6 +466,15 @@ class BodyIndexer : public RecursiveASTVisitor<BodyIndexer> { } return true; } + + bool VisitUnresolvedLookupExpr(UnresolvedLookupExpr *E) { + SmallVector<SymbolRelation, 4> Relations; + SymbolRoleSet Roles = getRolesForRef(E, Relations); + for (auto *D : E->decls()) + IndexCtx.handleReference(D, E->getNameLoc(), Parent, ParentDC, Roles, + Relations, E); + return true; + } }; } // anonymous namespace diff --git a/clang/test/Index/Core/index-dependent-source.cpp b/clang/test/Index/Core/index-dependent-source.cpp index 2e111339af61..8832edefd5bf 100644 --- a/clang/test/Index/Core/index-dependent-source.cpp +++ b/clang/test/Index/Core/index-dependent-source.cpp @@ -224,3 +224,10 @@ struct UsingE : public UsingD<T>, public UsingD<U> { // CHECK: [[@LINE+1]]:9 | struct(Gen)/C++ | UsingD | c:@ST>1#T@UsingD | <no-cgname> | Ref,RelCont | rel: 1 using UsingD<U>::foo; }; + +template <typename T> void foo(); +// CHECK: [[@LINE-1]]:28 | function/C | foo | c:@FT@>1#Tfoo#v# | <no-cgname> | Decl | rel: 0 +template <typename T> void bar() { + foo<T>(); +// CHECK: [[@LINE-1]]:3 | function/C | foo | c:@FT@>1#Tfoo#v# | <no-cgname> | Ref,Call,RelCall,RelCont | rel: 1 +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits