================
@@ -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;
----------------
zahiraam wrote:

For `BindingDecls`, the feature is currently blocked by a Sema crash in 
`ActOnOpenMPLastprivateClause` when a `BindingDecl` is in both clauses.  I've 
kept it as defensive programming for when that's fixed in a subsequent PR.

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