================
@@ -19504,19 +19516,27 @@ static bool captureInCapturedRegion(
if (IsTopScope && Kind != TryCaptureKind::Implicit) {
ByRef = (Kind == TryCaptureKind::ExplicitByRef);
} else if (S.getLangOpts().OpenMP && RSI->CapRegionKind == CR_OpenMP) {
+ bool IsBindingDecl = isa<BindingDecl>(Var);
+ ValueDecl *DSAVar = Var;
// Using an LValue reference type is consistent with Lambdas (see below).
- if (S.OpenMP().isOpenMPCapturedDecl(Var)) {
+ if (VarDecl *VD = S.OpenMP().isOpenMPCapturedDecl(Var)) {
+ Var = VD; // Capture the DecompositionDecl.
bool HasConst = DeclRefType.isConstQualified();
+ // Note: DeclRefType should remain the BindingDecl's type (e.g., int),
+ // not the DecompositionDecl's type (e.g., Point). The variable being
+ // captured is the DecompositionDecl, but expressions still reference
+ // the individual binding's type.
DeclRefType = DeclRefType.getUnqualifiedType();
// Don't lose diagnostics about assignments to const.
if (HasConst)
DeclRefType.addConst();
}
// Do not capture firstprivates in tasks.
- if (S.OpenMP().isOpenMPPrivateDecl(Var, RSI->OpenMPLevel,
+ if (!IsBindingDecl &&
----------------
zahiraam wrote:
Handled `BindingDecls` by transforming them to member expressions on the
original variable. This avoids capture-kind inconsistencies when different
bindings from the same `DecompositionDecl` have different map types.
Added LIT test `structured-bindings-target-map-different-types.cpp `.
https://github.com/llvm/llvm-project/pull/190832
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits