diff options
| author | Nathan Ridge <zeratul976@hotmail.com> | 2019-12-05 18:29:32 -0500 |
|---|---|---|
| committer | Nathan Ridge <zeratul976@hotmail.com> | 2019-12-12 17:18:00 -0500 |
| commit | ecaa9363303e811a051ebb6199e35e43319a699c (patch) | |
| tree | b948fbcd68d65769af9c1f17abbe4d2190f2d70e /clang-tools-extra/clangd/unittests/XRefsTests.cpp | |
| parent | c6b8c3d5d9a37b24bffa0bfc085a81f041bedc18 (diff) | |
| download | bcm5719-llvm-ecaa9363303e811a051ebb6199e35e43319a699c.tar.gz bcm5719-llvm-ecaa9363303e811a051ebb6199e35e43319a699c.zip | |
[clangd] Heuristically resolve dependent method calls
Summary:
The heuristic is to look in the definition of the primary template,
which is what you want in the vast majority of cases.
Fixes https://github.com/clangd/clangd/issues/141
Reviewers: sammccall
Subscribers: ilya-biryukov, MaskRay, jkorous, arphaman, kadircet, usaxena95, cfe-commits
Tags: #clang
Differential Revision: https://reviews.llvm.org/D71240
Diffstat (limited to 'clang-tools-extra/clangd/unittests/XRefsTests.cpp')
| -rw-r--r-- | clang-tools-extra/clangd/unittests/XRefsTests.cpp | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/clang-tools-extra/clangd/unittests/XRefsTests.cpp b/clang-tools-extra/clangd/unittests/XRefsTests.cpp index 058f205bb3a..0352322790b 100644 --- a/clang-tools-extra/clangd/unittests/XRefsTests.cpp +++ b/clang-tools-extra/clangd/unittests/XRefsTests.cpp @@ -465,6 +465,51 @@ TEST(LocateSymbol, All) { template <typename T> struct Fo^o<T*> {}; + )cpp", + + R"cpp(// Heuristic resolution of dependent method + template <typename T> + struct S { + void [[bar]]() {} + }; + + template <typename T> + void foo(S<T> arg) { + arg.ba^r(); + } + )cpp", + + R"cpp(// Heuristic resolution of dependent method via this-> + template <typename T> + struct S { + void [[foo]]() { + this->fo^o(); + } + }; + )cpp", + + R"cpp(// Heuristic resolution of dependent static method + template <typename T> + struct S { + static void [[bar]]() {} + }; + + template <typename T> + void foo() { + S<T>::ba^r(); + } + )cpp", + + R"cpp(// FIXME: Heuristic resolution of dependent method + // invoked via smart pointer + template <typename> struct S { void foo(); }; + template <typename T> struct unique_ptr { + T* operator->(); + }; + template <typename T> + void test(unique_ptr<S<T>>& V) { + V->fo^o(); + } )cpp"}; for (const char *Test : Tests) { Annotations T(Test); @@ -525,6 +570,21 @@ TEST(LocateSymbol, Ambiguous) { Foo abcde$10^("asdf"); Foo foox2 = Foo$11^("asdf"); } + + template <typename T> + struct S { + void $NonstaticOverload1[[bar]](int); + void $NonstaticOverload2[[bar]](float); + + static void $StaticOverload1[[baz]](int); + static void $StaticOverload2[[baz]](float); + }; + + template <typename T, typename U> + void dependent_call(S<T> s, U u) { + s.ba$12^r(u); + S<T>::ba$13^z(u); + } )cpp"); auto AST = TestTU::withCode(T.code()).build(); // Ordered assertions are deliberate: we expect a predictable order. @@ -544,6 +604,15 @@ TEST(LocateSymbol, Ambiguous) { ElementsAre(Sym("Foo", T.range("ConstructorLoc")))); EXPECT_THAT(locateSymbolAt(AST, T.point("11")), ElementsAre(Sym("Foo", T.range("ConstructorLoc")))); + // These assertions are unordered because the order comes from + // CXXRecordDecl::lookupDependentName() which doesn't appear to provide + // an order guarantee. + EXPECT_THAT(locateSymbolAt(AST, T.point("12")), + UnorderedElementsAre(Sym("bar", T.range("NonstaticOverload1")), + Sym("bar", T.range("NonstaticOverload2")))); + EXPECT_THAT(locateSymbolAt(AST, T.point("13")), + UnorderedElementsAre(Sym("baz", T.range("StaticOverload1")), + Sym("baz", T.range("StaticOverload2")))); } TEST(LocateSymbol, TemplateTypedefs) { |

