diff --git a/flang/lib/Semantics/resolve-directives.cpp b/flang/lib/Semantics/resolve-directives.cpp index 3d3630e8f388c..1910941dc32a5 100644 --- a/flang/lib/Semantics/resolve-directives.cpp +++ b/flang/lib/Semantics/resolve-directives.cpp @@ -1542,8 +1542,15 @@ bool OmpAttributeVisitor::Pre(const parser::OpenMPBlockConstruct &x) { } if (beginDir.v == llvm::omp::Directive::OMPD_master) IssueNonConformanceWarning(beginDir.v, beginDir.source); - ClearDataSharingAttributeObjects(); - ClearPrivateDataSharingAttributeObjects(); + + // The omp_taskgroup directive doesn't have its own data-sharing clauses. + // It inherits data-sharing attributes from the surrounding context. + // Therefore, don't clear the data-sharing attributes if it's an omp taskgroup + if (beginDir.v != llvm::omp::Directive::OMPD_taskgroup) { + ClearDataSharingAttributeObjects(); + ClearPrivateDataSharingAttributeObjects(); + } + ClearAllocateNames(); return true; } diff --git a/flang/test/Semantics/OpenMP/omp_taskgroup_allocate.f90 b/flang/test/Semantics/OpenMP/omp_taskgroup_allocate.f90 new file mode 100644 index 0000000000000..82e08254ffb31 --- /dev/null +++ b/flang/test/Semantics/OpenMP/omp_taskgroup_allocate.f90 @@ -0,0 +1,12 @@ +! RUN: %flang_fc1 -fopenmp -fopenmp-version=50 -fsyntax-only %s + +! Verify that a list item with a private data-sharing clause used in the 'allocate' clause of 'taskgroup' +! causes no semantic errors. + +subroutine omp_allocate_taskgroup + integer :: x + !$omp parallel private(x) + !$omp taskgroup allocate(x) + !$omp end taskgroup + !$omp end parallel +end subroutine