[clang] [Clang] [CodeGen] Perform derived-to-base conversion on explicit object parameter in lambda (PR #89828)

via cfe-commits cfe-commits at lists.llvm.org
Wed Apr 24 11:09:01 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?");
----------------
Sirraide wrote:

On that note, as for actually emitting the cast, is it worth it doing that once when we start emitting the lambda and then just reusing the computed lvalue instead of emitting the cast every time we need to access a capture? Or do we just let the optimiser clean that up? Asking because I’m not too familiar w/ how situations like these are typically handled in codegen.

https://github.com/llvm/llvm-project/pull/89828


More information about the cfe-commits mailing list