Skip to content

Commit ea94986

Browse files
[clang][HeuristicResolver] Apply default argument heuristic in resolveDeclRefExpr as well
1 parent 9aff609 commit ea94986

File tree

3 files changed

+21
-4
lines changed

3 files changed

+21
-4
lines changed

clang-tools-extra/clangd/unittests/XRefsTests.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1091,7 +1091,7 @@ TEST(LocateSymbol, All) {
10911091
)objc",
10921092
R"cpp(
10931093
struct PointerIntPairInfo {
1094-
static void *getPointer(void *Value);
1094+
static void *$decl[[getPointer]](void *Value);
10951095
};
10961096
10971097
template <typename Info = PointerIntPairInfo> struct PointerIntPair {

clang/lib/Sema/HeuristicResolver.cpp

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

301301
std::vector<const NamedDecl *>
302302
HeuristicResolverImpl::resolveDeclRefExpr(const DependentScopeDeclRefExpr *RE) {
303-
return resolveDependentMember(
304-
resolveNestedNameSpecifierToType(RE->getQualifier()), RE->getDeclName(),
305-
StaticFilter);
303+
QualType Qualifier = resolveNestedNameSpecifierToType(RE->getQualifier());
304+
Qualifier = simplifyType(Qualifier, nullptr, /*UnwrapPointer=*/false);
305+
return resolveDependentMember(Qualifier, RE->getDeclName(), StaticFilter);
306306
}
307307

308308
std::vector<const NamedDecl *>

clang/unittests/Sema/HeuristicResolverTest.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -429,6 +429,23 @@ TEST(HeuristicResolver, DeclRefExpr_StaticMethod) {
429429
cxxMethodDecl(hasName("bar")).bind("output"));
430430
}
431431

432+
TEST(HeuristicResolver, DeclRefExpr_DefaultTemplateArgument) {
433+
std::string Code = R"cpp(
434+
struct Default {
435+
static void foo();
436+
};
437+
template <typename T = Default>
438+
void bar() {
439+
T::foo();
440+
}
441+
)cpp";
442+
// Test resolution of "foo" in "T::foo()".
443+
expectResolution(
444+
Code, &HeuristicResolver::resolveDeclRefExpr,
445+
dependentScopeDeclRefExpr(hasDependentName("foo")).bind("input"),
446+
cxxMethodDecl(hasName("foo")).bind("output"));
447+
}
448+
432449
TEST(HeuristicResolver, DeclRefExpr_StaticOverloads) {
433450
std::string Code = R"cpp(
434451
template <typename T>

0 commit comments

Comments
 (0)