Skip to content

Commit af23d2c

Browse files
fix: Try to emit refs for unresolved call expressions (#437)
This includes kernel call expressions which often appear inside templates and hence aren't resolved.
1 parent 99f440a commit af23d2c

File tree

5 files changed

+77
-0
lines changed

5 files changed

+77
-0
lines changed

indexer/ClangAstMacros.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
F(CXXDependentScopeMember) \
3333
F(DeclRef) \
3434
F(Member) \
35+
F(UnresolvedLookup) \
3536
F(UnresolvedMember)
3637

3738
#define FOR_EACH_TYPE_TO_BE_INDEXED(F) \

indexer/Indexer.cc

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1022,6 +1022,32 @@ void TuIndexer::saveMemberExpr(const clang::MemberExpr &memberExpr) {
10221022
this->saveReference(optSymbol.value(), memberExpr.getMemberLoc(), namedDecl);
10231023
}
10241024

1025+
void TuIndexer::saveUnresolvedLookupExpr(
1026+
const clang::UnresolvedLookupExpr &unresolvedLookupExpr) {
1027+
// The number 32 has been chosen somewhat arbitrarily.
1028+
// C++ has 20 fundamental types (see
1029+
// https://stackoverflow.com/a/51777680/2682729) so 32 should cover situations
1030+
// where overloads for all fundamental types are present, and then some. Set a
1031+
// limit here to reduce risk of blowing up index sizes and indexing time in
1032+
// case there are a LOT of unresolved lookup expressions.
1033+
size_t MAX_UNRESOLVED_DECL_LIMIT = 16;
1034+
size_t count = 0;
1035+
for (auto *namedDecl : unresolvedLookupExpr.decls()) {
1036+
if (!namedDecl) {
1037+
continue;
1038+
}
1039+
auto optSymbol = this->symbolFormatter.getNamedDeclSymbol(*namedDecl);
1040+
if (!optSymbol) {
1041+
continue;
1042+
}
1043+
this->saveReference(*optSymbol, unresolvedLookupExpr.getNameLoc());
1044+
++count;
1045+
if (count == MAX_UNRESOLVED_DECL_LIMIT) {
1046+
break;
1047+
}
1048+
}
1049+
}
1050+
10251051
void TuIndexer::saveUnresolvedMemberExpr(
10261052
const clang::UnresolvedMemberExpr &unresolvedMemberExpr) {
10271053
this->trySaveMemberReferenceViaLookup(

test/index/cuda/kernelcall.cu

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,3 +58,15 @@ struct b {
5858
}
5959
void e() { d0(1); }
6060
};
61+
62+
namespace x {
63+
namespace y {
64+
template <typename DType, int layout>
65+
__global__ void mykernel(const int nthreads, const DType *in_data, DType *out_data) {}
66+
}
67+
}
68+
69+
template <typename DType, int layout>
70+
void call_mykernel2() {
71+
x::y::mykernel<DType, layout><<<0, 0>>>(0, nullptr, nullptr);
72+
}

test/index/cuda/kernelcall.snapshot.cu

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
// ^ reference [..] dim3#dim3(6df00707c193238d).
3636
// ^ reference [..] dim3#dim3(6df00707c193238d).
3737
g1(42); // expected-error {{call to global function 'g1' not configured}}
38+
// ^^ reference [..] g1(d4f767463ce0a6b3).
3839
g1<<<1>>>(42); // expected-error {{too few execution configuration arguments to kernel function call}}
3940
g1<<<1, 1, 0, 0, 0>>>(42); // expected-error {{too many execution configuration arguments to kernel function call}}
4041

@@ -103,6 +104,7 @@
103104
// ^^^ reference local 10
104105
a1::Call<<<0,0>>>(arg);
105106
// ^^ reference [..] a1#
107+
// ^^^^ reference [..] a1#Call(9b289cee16747614).
106108
// ^ reference [..] dim3#dim3(6df00707c193238d).
107109
// ^ reference [..] dim3#dim3(6df00707c193238d).
108110
// ^^^ reference local 10
@@ -113,6 +115,8 @@
113115
// ^^^ reference local 10
114116
a3::Call<<<0, 0>>>(arg);
115117
// ^^ reference [..] a3#
118+
// ^^^^ reference [..] a3#Call(5d22bdacc48458e8).
119+
// ^^^^ reference [..] a3#Call(d4f767463ce0a6b3).
116120
// ^ reference [..] dim3#dim3(6df00707c193238d).
117121
// ^ reference [..] dim3#dim3(6df00707c193238d).
118122
// ^^^ reference local 10
@@ -149,3 +153,36 @@
149153
// ^ definition [..] b#e(49f6e7a06ebc5aa8).
150154
// ^^ reference [..] b#d0(d4f767463ce0a6b3).
151155
};
156+
157+
namespace x {
158+
// ^ definition [..] x/
159+
namespace y {
160+
// ^ definition [..] x/y/
161+
template <typename DType, int layout>
162+
// ^^^^^ definition local 12
163+
// ^^^^^^ definition local 13
164+
__global__ void mykernel(const int nthreads, const DType *in_data, DType *out_data) {}
165+
// ^^^^^^^^^^ reference [..] `cuda_stub.h:12:9`!
166+
// ^^^^^^^^ definition [..] x/y/mykernel(36fc24b3817d5bcc).
167+
// ^^^^^^^^ definition local 14
168+
// ^^^^^ reference local 12
169+
// ^^^^^^^ definition local 15
170+
// ^^^^^ reference local 12
171+
// ^^^^^^^^ definition local 16
172+
}
173+
}
174+
175+
template <typename DType, int layout>
176+
// ^^^^^ definition local 17
177+
// ^^^^^^ definition local 18
178+
void call_mykernel2() {
179+
// ^^^^^^^^^^^^^^ definition [..] call_mykernel2(49f6e7a06ebc5aa8).
180+
x::y::mykernel<DType, layout><<<0, 0>>>(0, nullptr, nullptr);
181+
// ^ reference [..] x/
182+
// ^ reference [..] x/y/
183+
// ^^^^^^^^ reference [..] x/y/mykernel(36fc24b3817d5bcc).
184+
// ^^^^^ reference local 17
185+
// ^^^^^^ reference local 18
186+
// ^ reference [..] dim3#dim3(6df00707c193238d).
187+
// ^ reference [..] dim3#dim3(6df00707c193238d).
188+
}

test/index/functions/templates.snapshot.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@
5555
// ^^ definition [..] h1(9b289cee16747614).
5656
// ^ reference local 7
5757
// ^ definition local 8
58+
// ^^ reference [..] h0(9b289cee16747614).
5859
// ^ reference local 7
5960
// ^ reference local 8
6061

0 commit comments

Comments
 (0)