Skip to content

Commit 5692e56

Browse files
fix: Handle missing definition on member lookup (#330)
1 parent 375b4cf commit 5692e56

File tree

3 files changed

+55
-1
lines changed

3 files changed

+55
-1
lines changed

indexer/ApproximateNameResolver.cc

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#include "llvm/ADT/SmallVector.h"
77

88
#include "indexer/ApproximateNameResolver.h"
9+
#include "indexer/DebugHelpers.h"
910
#include "indexer/Enforce.h"
1011

1112
#include "spdlog/spdlog.h"
@@ -44,9 +45,10 @@ ApproximateNameResolver::tryResolveMember(
4445
auto *type = typesToLookup.back();
4546
typesToLookup.pop_back();
4647
auto *cxxRecordDecl = Self::tryFindDeclForType(type);
47-
if (!cxxRecordDecl) {
48+
if (!cxxRecordDecl || !cxxRecordDecl->hasDefinition()) {
4849
continue;
4950
}
51+
cxxRecordDecl = cxxRecordDecl->getDefinition();
5052
auto lookupResults =
5153
cxxRecordDecl->lookupDependentName(declNameInfo.getName(), filter);
5254
for (auto *namedDecl : lookupResults) {

test/index/functions/templates.cc

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,4 +58,21 @@ struct Q2: Q1<T> {
5858
using Base2 = Q1<T>;
5959
using Base2::f;
6060
void h() { f(); }
61+
};
62+
63+
template <typename T>
64+
struct FwdDecl1;
65+
66+
template <typename T>
67+
struct FwdDecl2;
68+
69+
template <typename X>
70+
void f(FwdDecl1<X> &a1, FwdDecl2<X> &a2) {
71+
a1.whatever(); // No code nav, sorry
72+
a2.whatever();
73+
}
74+
75+
template <typename T>
76+
struct FwdDecl2 {
77+
void whatever() {}
6178
};

test/index/functions/templates.snapshot.cc

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,3 +136,38 @@
136136
// ^ definition [..] Q2#h(49f6e7a06ebc5aa8).
137137
// ^ reference [..] Q0#f(49f6e7a06ebc5aa8).
138138
};
139+
140+
template <typename T>
141+
// ^ definition local 14
142+
struct FwdDecl1;
143+
// ^^^^^^^^ reference [..] FwdDecl1#
144+
145+
template <typename T>
146+
// ^ definition local 15
147+
struct FwdDecl2;
148+
// ^^^^^^^^ reference [..] FwdDecl2#
149+
150+
template <typename X>
151+
// ^ definition local 16
152+
void f(FwdDecl1<X> &a1, FwdDecl2<X> &a2) {
153+
// ^ definition [..] f(4764f947061d9ce0).
154+
// ^^^^^^^^ reference [..] FwdDecl1#
155+
// ^ reference local 16
156+
// ^^ definition local 17
157+
// ^^^^^^^^ reference [..] FwdDecl2#
158+
// ^ reference local 16
159+
// ^^ definition local 18
160+
a1.whatever(); // No code nav, sorry
161+
// ^^ reference local 17
162+
a2.whatever();
163+
// ^^ reference local 18
164+
// ^^^^^^^^ reference [..] FwdDecl2#whatever(49f6e7a06ebc5aa8).
165+
}
166+
167+
template <typename T>
168+
// ^ definition local 19
169+
struct FwdDecl2 {
170+
// ^^^^^^^^ definition [..] FwdDecl2#
171+
void whatever() {}
172+
// ^^^^^^^^ definition [..] FwdDecl2#whatever(49f6e7a06ebc5aa8).
173+
};

0 commit comments

Comments
 (0)