================
@@ -301,9 +302,34 @@ std::vector<const NamedDecl *>
HeuristicResolverImpl::resolveMemberExpr(
return {};
}
+ // check if member expr is in the context of an explicit object method
+ // If so, it's safe to assume the templated arg is of type of the record
+ const auto ExplicitMemberHeuristic =
+ [&](const Expr *Base) -> std::optional<QualType> {
+ if (auto *DeclRef = dyn_cast_if_present<DeclRefExpr>(Base)) {
+ auto *PrDecl = dyn_cast_if_present<ParmVarDecl>(DeclRef->getDecl());
+
+ if (PrDecl && PrDecl->isExplicitObjectParameter()) {
+ auto CxxRecord = dyn_cast_if_present<CXXRecordDecl>(
+ PrDecl->getDeclContext()->getParent());
+
+ if (CxxRecord) {
+ return Ctx.getTypeDeclType(dyn_cast<TypeDecl>(CxxRecord));
----------------
zwuis wrote:
`TypeDecl` is an indirect base class of `CXXRecordDecl`. `dyn_cast` can be
removed. (Inheritance diagram in <https://clang.llvm.org/doxygen> may be useful)
https://github.com/llvm/llvm-project/pull/155143
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits