================
@@ -1168,11 +1154,43 @@ bool CodeGenFunction::EmitOMPFirstprivateClause(const 
OMPExecutableDirective &D,
     const auto *IRef = C->varlist_begin();
     const auto *InitsRef = C->inits().begin();
     for (const Expr *IInit : C->private_copies()) {
-      const auto *OrigVD = cast<VarDecl>(cast<DeclRefExpr>(*IRef)->getDecl());
+      const auto *OrigDecl = cast<DeclRefExpr>(*IRef)->getDecl();
+      const VarDecl *OrigVD = dyn_cast<VarDecl>(OrigDecl);
+      const auto *VD = cast<VarDecl>(cast<DeclRefExpr>(IInit)->getDecl());
+
+      if (const auto *BD = dyn_cast<BindingDecl>(OrigDecl)) {
+        // Check if this binding is also lastprivate.
+        bool ThisFirstprivateIsLastprivate =
+            Lastprivates.count(BD->getCanonicalDecl()) > 0;
+        const auto *VDInit =
+            cast<VarDecl>(cast<DeclRefExpr>(*InitsRef)->getDecl());
+        DeclRefExpr DRE(getContext(), const_cast<BindingDecl *>(BD),
+                        /*RefersToEnclosingVariableOrCapture=*/true,
+                        BD->getType(), VK_LValue, (*IRef)->getExprLoc());
+        LValue OriginalLVal = EmitLValue(&DRE);
+        Address OriginalAddr = OriginalLVal.getAddress();
+        // Emit private VarDecl with copy init. Remap VDInit to point to the
+        // original binding so EmitDecl properly initializes VD.
+        setAddrOfLocalVar(VDInit, OriginalAddr);
+        EmitDecl(*VD);
+        LocalDeclMap.erase(VDInit);
+        Address VDAddr = GetAddrOfLocalVar(VD);
+        bool IsRegistered = PrivateScope.addPrivate(BD, VDAddr);
+        assert(IsRegistered &&
+               "firstprivate var already registered as firstprivate");
+        (void)IsRegistered;
+        FirstprivateIsLastprivate =
+            FirstprivateIsLastprivate || ThisFirstprivateIsLastprivate;
+        ++IRef;
+        ++InitsRef;
+        continue;
+      }
+
+      // Original VarDecl logic.
+      assert(OrigVD && "Expected VarDecl for non-BindingDecl firstprivate");
       bool ThisFirstprivateIsLastprivate =
-          Lastprivates.count(OrigVD->getCanonicalDecl()) > 0;
+          OrigVD && Lastprivates.count(OrigVD->getCanonicalDecl()) > 0;
----------------
alexey-bataev wrote:

```suggestion
          Lastprivates.count(OrigVD->getCanonicalDecl()) > 0;
```

https://github.com/llvm/llvm-project/pull/190832
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to