diff --git a/flang/lib/Semantics/resolve-directives.cpp b/flang/lib/Semantics/resolve-directives.cpp index 65823adcef19d..93bf510fbc3c7 100644 --- a/flang/lib/Semantics/resolve-directives.cpp +++ b/flang/lib/Semantics/resolve-directives.cpp @@ -2382,7 +2382,9 @@ void OmpAttributeVisitor::CreateImplicitSymbols(const Symbol *symbol) { dsa = prevDSA; } else if (taskGenDir) { // TODO 5) dummy arg in orphaned taskgen construct -> firstprivate - if (prevDSA.test(Symbol::Flag::OmpShared) || isStaticStorageDuration) { + if (prevDSA.test(Symbol::Flag::OmpShared) || + (isStaticStorageDuration && + (prevDSA & dataSharingAttributeFlags).none())) { // 6) shared in enclosing context -> shared dsa = {Symbol::Flag::OmpShared}; makeSymbol(dsa); diff --git a/flang/test/Semantics/OpenMP/implicit-dsa.f90 b/flang/test/Semantics/OpenMP/implicit-dsa.f90 index 3e9348575597b..4a07e256e2bb6 100644 --- a/flang/test/Semantics/OpenMP/implicit-dsa.f90 +++ b/flang/test/Semantics/OpenMP/implicit-dsa.f90 @@ -244,3 +244,25 @@ subroutine implicit_dsa_test_12 !REF: /implicit_dsa_test_12/tm3a print *,tm3a end subroutine + +! Test static duration variables with DSA set in the enclosing scope do not default to shared DSA +!DEF: /implicit_dsa_test_13_mod Module +module implicit_dsa_test_13_mod + !DEF: /implicit_dsa_test_13_mod/a PUBLIC ObjectEntity INTEGER(4) + integer::a=5 +contains + !DEF: /implicit_dsa_test_13_mod/implicit_dsa_test_13 PUBLIC (Subroutine) Subprogram + subroutine implicit_dsa_test_13 + !DEF: /implicit_dsa_test_13_mod/implicit_dsa_test_13/i ObjectEntity INTEGER(4) + integer i + !$omp do private(a) + !DEF: /implicit_dsa_test_13_mod/implicit_dsa_test_13/OtherConstruct1/i (OmpPrivate, OmpPreDetermined) HostAssoc INTEGER(4) + do i=0,10 + !$omp task + !DEF: /implicit_dsa_test_13_mod/implicit_dsa_test_13/OtherConstruct1/OtherConstruct1/a (OmpFirstPrivate, OmpImplicit) HostAssoc INTEGER(4) + !DEF: /implicit_dsa_test_13_mod/implicit_dsa_test_13/OtherConstruct1/OtherConstruct1/i (OmpFirstPrivate, OmpImplicit) HostAssoc INTEGER(4) + a=a+i + !$omp end task + end do + end subroutine implicit_dsa_test_13 +end module implicit_dsa_test_13_mod