summaryrefslogtreecommitdiffstats
path: root/clang-tools-extra/clangd/unittests/XRefsTests.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'clang-tools-extra/clangd/unittests/XRefsTests.cpp')
-rw-r--r--clang-tools-extra/clangd/unittests/XRefsTests.cpp69
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) {
OpenPOWER on IntegriCloud