================
@@ -301,10 +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) -> QualType {
+ if (auto *DeclRef = dyn_cast_if_present<DeclRefExpr>(Base)) {
+ auto *PrDecl = dyn_cast_if_present<ParmVarDecl>(DeclRef->getDecl());
+
+ if (PrDecl && PrDecl->isExplicitObjectParameter()) {
+ // get the parent, a cxxrecord
+ return Ctx.getTypeDeclType(
+ dyn_cast<TypeDecl>(PrDecl->getDeclContext()->getParent()));
+ }
+ }
+
+ return {};
+ };
+
// Try resolving the member inside the expression's base type.
Expr *Base = ME->isImplicitAccess() ? nullptr : ME->getBase();
QualType BaseType = ME->getBaseType();
BaseType = simplifyType(BaseType, Base, ME->isArrow());
+
+ if (!BaseType.isNull() &&
----------------
HighCommander4 wrote:
Can we move this into `simplifyType` itself? Specifically, inside
[`SimplifyOneStep`](https://searchfox.org/llvm/rev/feac561478bbdbc28a4fe22ba070e27a3a495ffb/clang/lib/Sema/HeuristicResolver.cpp#208),
what are `BaseType` and `Base` here are available as `T.Type` and `T.Expr`
respectively.
That would make this heuristic a bit more general. (For example, in combination
with [this patch](https://github.com/llvm/llvm-project/pull/151643) which adds
a `simplifyType` call site in `SemaCodeComplete`, it gets code completion to
work after `self.^` in such a function.)
https://github.com/llvm/llvm-project/pull/155143
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits