kadircet created this revision. kadircet added a reviewer: sammccall. Herald added subscribers: usaxena95, arphaman. kadircet requested review of this revision. Herald added projects: clang, clang-tools-extra. Herald added a subscriber: cfe-commits.
Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D117037 Files: clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp clang/lib/Sema/SemaCodeComplete.cpp Index: clang/lib/Sema/SemaCodeComplete.cpp =================================================================== --- clang/lib/Sema/SemaCodeComplete.cpp +++ clang/lib/Sema/SemaCodeComplete.cpp @@ -5411,9 +5411,21 @@ Base = Base->getPointeeType(); // could handle unique_ptr etc here? RecordDecl *RD = Base.isNull() ? nullptr : getAsRecordDecl(Base); if (RD && RD->isCompleteDefinition()) { - for (const auto *Member : RD->lookup(CDSME->getMember())) - if (const ValueDecl *VD = llvm::dyn_cast<ValueDecl>(Member)) - return VD->getType().getNonReferenceType(); + // For c++ records perform a dependent name lookup, which also takes care + // of the bases. + if (auto *CXXRD = llvm::dyn_cast<CXXRecordDecl>(RD)) { + for (const auto *Member : CXXRD->lookupDependentName( + CDSME->getMember(), [](const NamedDecl *Member) { + return llvm::isa<ValueDecl>(Member); + })) { + return llvm::cast<ValueDecl>(Member)->getType().getNonReferenceType(); + } + } else { + for (const auto *Member : RD->lookup(CDSME->getMember())) { + if (const ValueDecl *VD = llvm::dyn_cast<ValueDecl>(Member)) + return VD->getType().getNonReferenceType(); + } + } } } return Unresolved; Index: clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp =================================================================== --- clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp +++ clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp @@ -3453,6 +3453,19 @@ } } +TEST(CompletionTest, UndeducedType) { + clangd::CodeCompleteOptions Opts; + const std::string Code = R"cpp( +struct Base { Base foo(); }; + +template <typename T> struct Foo : Base { + void bar() { this->foo().^foo(); } +}; + )cpp"; + + EXPECT_THAT(completions(Code, {}, Opts).Completions, + Contains(Labeled("foo()"))); +} } // namespace } // namespace clangd } // namespace clang
Index: clang/lib/Sema/SemaCodeComplete.cpp =================================================================== --- clang/lib/Sema/SemaCodeComplete.cpp +++ clang/lib/Sema/SemaCodeComplete.cpp @@ -5411,9 +5411,21 @@ Base = Base->getPointeeType(); // could handle unique_ptr etc here? RecordDecl *RD = Base.isNull() ? nullptr : getAsRecordDecl(Base); if (RD && RD->isCompleteDefinition()) { - for (const auto *Member : RD->lookup(CDSME->getMember())) - if (const ValueDecl *VD = llvm::dyn_cast<ValueDecl>(Member)) - return VD->getType().getNonReferenceType(); + // For c++ records perform a dependent name lookup, which also takes care + // of the bases. + if (auto *CXXRD = llvm::dyn_cast<CXXRecordDecl>(RD)) { + for (const auto *Member : CXXRD->lookupDependentName( + CDSME->getMember(), [](const NamedDecl *Member) { + return llvm::isa<ValueDecl>(Member); + })) { + return llvm::cast<ValueDecl>(Member)->getType().getNonReferenceType(); + } + } else { + for (const auto *Member : RD->lookup(CDSME->getMember())) { + if (const ValueDecl *VD = llvm::dyn_cast<ValueDecl>(Member)) + return VD->getType().getNonReferenceType(); + } + } } } return Unresolved; Index: clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp =================================================================== --- clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp +++ clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp @@ -3453,6 +3453,19 @@ } } +TEST(CompletionTest, UndeducedType) { + clangd::CodeCompleteOptions Opts; + const std::string Code = R"cpp( +struct Base { Base foo(); }; + +template <typename T> struct Foo : Base { + void bar() { this->foo().^foo(); } +}; + )cpp"; + + EXPECT_THAT(completions(Code, {}, Opts).Completions, + Contains(Labeled("foo()"))); +} } // namespace } // namespace clangd } // namespace clang
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits