[clang] [Clang] [CodeGen] Perform derived-to-base conversion on explicit object parameter in lambda (PR #89828)
John McCall via cfe-commits
cfe-commits at lists.llvm.org
Wed Apr 24 10:34:06 PDT 2024
================
@@ -4684,6 +4684,29 @@ LValue CodeGenFunction::EmitLValueForLambdaField(const FieldDecl *Field,
else
LambdaLV = MakeAddrLValue(AddrOfExplicitObject,
D->getType().getNonReferenceType());
+
+ // Make sure we have an lvalue to the lambda itself and not a derived class.
+ auto *ThisTy = D->getType().getNonReferenceType()->getAsCXXRecordDecl();
+ auto *LambdaTy = cast<CXXRecordDecl>(Field->getParent());
+ if (ThisTy != LambdaTy) {
+ CXXBasePaths Paths(/*FindAmbiguities=*/false, /*RecordPaths=*/true,
+ /*DetectVirtual=*/false);
+
+ [[maybe_unused]] bool Derived = ThisTy->isDerivedFrom(LambdaTy, Paths);
+ assert(Derived && "Type not derived from lambda type?");
----------------
rjmccall wrote:
If we were going to put it in the AST, the right place would be on the call operator FD rather than in every DRE for a capture. We'd presumably store it with a side-table in the ASTContext, which we'd only populate for lambdas with a derived object parameter. It's probably not an actual problem to repeatedly recompute it as long as we have that restriction, though.
https://github.com/llvm/llvm-project/pull/89828
More information about the cfe-commits
mailing list