diff --git a/clang/lib/Sema/HeuristicResolver.cpp b/clang/lib/Sema/HeuristicResolver.cpp index 0c57250e63df2..36e5b44b8b12c 100644 --- a/clang/lib/Sema/HeuristicResolver.cpp +++ b/clang/lib/Sema/HeuristicResolver.cpp @@ -482,7 +482,8 @@ std::vector HeuristicResolverImpl::resolveDependentMember( if (!Filter(ND)) return false; if (const auto *MD = dyn_cast(ND)) { - return MD->getMethodQualifiers().compatiblyIncludes(QT.getQualifiers(), + return !MD->isInstance() || + MD->getMethodQualifiers().compatiblyIncludes(QT.getQualifiers(), Ctx); } return true; diff --git a/clang/unittests/Sema/HeuristicResolverTest.cpp b/clang/unittests/Sema/HeuristicResolverTest.cpp index a0deb2d936756..5c3459dbeb101 100644 --- a/clang/unittests/Sema/HeuristicResolverTest.cpp +++ b/clang/unittests/Sema/HeuristicResolverTest.cpp @@ -155,6 +155,26 @@ TEST(HeuristicResolver, MemberExpr_SmartPointer_Qualified) { cxxMethodDecl(hasName("find"), isConst()).bind("output")); } +TEST(HeuristicResolver, MemberExpr_Static_Qualified) { + std::string Code = R"cpp( + template + struct Waldo { + static void find(); + }; + template + void foo(const Waldo& t) { + t.find(); + } + )cpp"; + // Test resolution of "find" in "t.find()". + // The object being `const` should have no bearing on a call to a static + // method. + expectResolution( + Code, &HeuristicResolver::resolveMemberExpr, + cxxDependentScopeMemberExpr(hasMemberName("find")).bind("input"), + cxxMethodDecl(hasName("find")).bind("output")); +} + TEST(HeuristicResolver, MemberExpr_AutoTypeDeduction1) { std::string Code = R"cpp( template