diff --git a/clang/lib/Sema/HeuristicResolver.cpp b/clang/lib/Sema/HeuristicResolver.cpp index e893afed71d26..87c7274e7aefa 100644 --- a/clang/lib/Sema/HeuristicResolver.cpp +++ b/clang/lib/Sema/HeuristicResolver.cpp @@ -262,8 +262,9 @@ std::vector HeuristicResolverImpl::resolveMemberExpr( std::vector HeuristicResolverImpl::resolveDeclRefExpr(const DependentScopeDeclRefExpr *RE) { - return resolveDependentMember(QualType(RE->getQualifier()->getAsType(), 0), - RE->getDeclName(), StaticFilter); + return resolveDependentMember( + resolveNestedNameSpecifierToType(RE->getQualifier()), RE->getDeclName(), + StaticFilter); } std::vector diff --git a/clang/unittests/Sema/HeuristicResolverTest.cpp b/clang/unittests/Sema/HeuristicResolverTest.cpp index 2b775b11719ea..e5cd1254d7542 100644 --- a/clang/unittests/Sema/HeuristicResolverTest.cpp +++ b/clang/unittests/Sema/HeuristicResolverTest.cpp @@ -385,6 +385,27 @@ TEST(HeuristicResolver, DeclRefExpr_RespectScope) { dependentScopeDeclRefExpr(hasDependentName("getPointer")).bind("input")); } +TEST(HeuristicResolver, DeclRefExpr_Nested) { + std::string Code = R"cpp( + struct S { + static int Waldo; + }; + template + struct Meta { + using Type = S; + }; + template + void foo() { + Meta::Type::Waldo; + } + )cpp"; + // Test resolution of "Waldo" in "Meta::Type::Waldo". + expectResolution( + Code, &HeuristicResolver::resolveDeclRefExpr, + dependentScopeDeclRefExpr(hasDependentName("Waldo")).bind("input"), + varDecl(hasName("Waldo")).bind("output")); +} + TEST(HeuristicResolver, DependentNameType) { std::string Code = R"cpp( template