aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/Sema/SemaOpenMP.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'clang/lib/Sema/SemaOpenMP.cpp')
-rw-r--r--clang/lib/Sema/SemaOpenMP.cpp41
1 files changed, 19 insertions, 22 deletions
diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp
index 4ac3a60..a3395ac 100644
--- a/clang/lib/Sema/SemaOpenMP.cpp
+++ b/clang/lib/Sema/SemaOpenMP.cpp
@@ -19047,34 +19047,14 @@ static bool actOnOMPReductionKindClause(
reportOriginalDsa(S, Stack, D, DVar);
continue;
}
- // OpenMP 6.0 [ 7.6.10 ]
- // Support Reduction over private variables with reduction clause.
- // A list item in a reduction clause can now be private in the enclosing
- // context. For orphaned constructs it is assumed to be shared unless the
- // original(private) modifier appears in the clause.
- DVar = Stack->getImplicitDSA(D, true);
- bool IsOrphaned = false;
- OpenMPDirectiveKind CurrDir = Stack->getCurrentDirective();
- OpenMPDirectiveKind ParentDir = Stack->getParentDirective();
- // Check if the construct is orphaned (has no enclosing OpenMP context)
- IsOrphaned = ParentDir == OMPD_unknown;
- // OpenMP 6.0: Private DSA check
- IsPrivate =
- (S.getLangOpts().OpenMP > 52) &&
- ((isOpenMPPrivate(DVar.CKind) && DVar.CKind != OMPC_reduction &&
- isOpenMPWorksharingDirective(CurrDir) &&
- !isOpenMPParallelDirective(CurrDir) &&
- !isOpenMPTeamsDirective(CurrDir) &&
- !isOpenMPSimdDirective(ParentDir)) ||
- (IsOrphaned && DVar.CKind == OMPC_unknown) ||
- RD.OrigSharingModifier != OMPC_ORIGINAL_SHARING_shared);
// OpenMP [2.14.3.6, Restrictions, p.1]
// A list item that appears in a reduction clause of a worksharing
// construct must be shared in the parallel regions to which any of the
// worksharing regions arising from the worksharing construct bind.
- if (!IsPrivate && isOpenMPWorksharingDirective(CurrDir) &&
+ if (S.getLangOpts().OpenMP <= 52 &&
+ isOpenMPWorksharingDirective(CurrDir) &&
!isOpenMPParallelDirective(CurrDir) &&
!isOpenMPTeamsDirective(CurrDir)) {
DVar = Stack->getImplicitDSA(D, true);
@@ -19085,6 +19065,23 @@ static bool actOnOMPReductionKindClause(
reportOriginalDsa(S, Stack, D, DVar);
continue;
}
+ } else if (isOpenMPWorksharingDirective(CurrDir) &&
+ !isOpenMPParallelDirective(CurrDir) &&
+ !isOpenMPTeamsDirective(CurrDir)) {
+ // OpenMP 6.0 [ 7.6.10 ]
+ // Support Reduction over private variables with reduction clause.
+ // A list item in a reduction clause can now be private in the enclosing
+ // context. For orphaned constructs it is assumed to be shared unless
+ // the original(private) modifier appears in the clause.
+ DVar = Stack->getImplicitDSA(D, true);
+ // Determine if the variable should be considered private
+ IsPrivate = DVar.CKind != OMPC_shared;
+ bool IsOrphaned = false;
+ OpenMPDirectiveKind ParentDir = Stack->getParentDirective();
+ IsOrphaned = ParentDir == OMPD_unknown;
+ if ((IsOrphaned &&
+ RD.OrigSharingModifier == OMPC_ORIGINAL_SHARING_private))
+ IsPrivate = true;
}
} else {
// Threadprivates cannot be shared between threads, so dignose if the base