Skip to content

Commit a01e1d4

Browse files
[clang][Sema] Handle dependent qualifier in HeuristicResolver::resolveDeclRefExpr() (#124515)
1 parent 9452ee4 commit a01e1d4

File tree

2 files changed

+24
-2
lines changed

2 files changed

+24
-2
lines changed

clang/lib/Sema/HeuristicResolver.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -262,8 +262,9 @@ std::vector<const NamedDecl *> HeuristicResolverImpl::resolveMemberExpr(
262262

263263
std::vector<const NamedDecl *>
264264
HeuristicResolverImpl::resolveDeclRefExpr(const DependentScopeDeclRefExpr *RE) {
265-
return resolveDependentMember(QualType(RE->getQualifier()->getAsType(), 0),
266-
RE->getDeclName(), StaticFilter);
265+
return resolveDependentMember(
266+
resolveNestedNameSpecifierToType(RE->getQualifier()), RE->getDeclName(),
267+
StaticFilter);
267268
}
268269

269270
std::vector<const NamedDecl *>

clang/unittests/Sema/HeuristicResolverTest.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -385,6 +385,27 @@ TEST(HeuristicResolver, DeclRefExpr_RespectScope) {
385385
dependentScopeDeclRefExpr(hasDependentName("getPointer")).bind("input"));
386386
}
387387

388+
TEST(HeuristicResolver, DeclRefExpr_Nested) {
389+
std::string Code = R"cpp(
390+
struct S {
391+
static int Waldo;
392+
};
393+
template <typename T>
394+
struct Meta {
395+
using Type = S;
396+
};
397+
template <typename T>
398+
void foo() {
399+
Meta<T>::Type::Waldo;
400+
}
401+
)cpp";
402+
// Test resolution of "Waldo" in "Meta<T>::Type::Waldo".
403+
expectResolution(
404+
Code, &HeuristicResolver::resolveDeclRefExpr,
405+
dependentScopeDeclRefExpr(hasDependentName("Waldo")).bind("input"),
406+
varDecl(hasName("Waldo")).bind("output"));
407+
}
408+
388409
TEST(HeuristicResolver, DependentNameType) {
389410
std::string Code = R"cpp(
390411
template <typename>

0 commit comments

Comments
 (0)