diff --git a/flang/lib/Semantics/resolve-directives.cpp b/flang/lib/Semantics/resolve-directives.cpp index 98821c0ebdd2b..6c876ec69db60 100644 --- a/flang/lib/Semantics/resolve-directives.cpp +++ b/flang/lib/Semantics/resolve-directives.cpp @@ -1497,7 +1497,7 @@ void OmpAttributeVisitor::Post(const parser::OpenMPExecutableAllocate &x) { void OmpAttributeVisitor::Post(const parser::Name &name) { auto *symbol{name.symbol}; if (symbol && !dirContext_.empty() && GetContext().withinConstruct) { - if (!symbol->owner().IsDerivedType() && !symbol->has() && + if (!symbol->owner().IsDerivedType() && !IsProcedure(*symbol) && !IsObjectWithDSA(*symbol) && !IsNamedConstant(*symbol)) { // TODO: create a separate function to go through the rules for // predetermined, explicitly determined, and implicitly diff --git a/flang/test/Semantics/OpenMP/omp-default-none.f90 b/flang/test/Semantics/OpenMP/omp-default-none.f90 new file mode 100644 index 0000000000000..d027f46f00584 --- /dev/null +++ b/flang/test/Semantics/OpenMP/omp-default-none.f90 @@ -0,0 +1,41 @@ +!RUN: %python %S/../test_errors.py %s %flang -fopenmp +! Positive tests for default(none) +subroutine sb2(x) + real :: x +end subroutine + +subroutine sb1 + integer :: i + real :: a(10), b(10), k + inc(x) = x + 1.0 + abstract interface + function iface(a, b) + real, intent(in) :: a, b + real :: iface + end function + end interface + procedure(iface) :: compute + procedure(iface), pointer :: ptr => NULL() + ptr => fn2 + !$omp parallel default(none) shared(a,b,k) private(i) + do i = 1, 10 + b(i) = k + sin(a(i)) + inc(a(i)) + fn1(a(i)) + compute(a(i),k) + add(k, k) + call sb3(b(i)) + call sb2(a(i)) + end do + !$omp end parallel +contains + function fn1(x) + real :: x, fn1 + fn1 = x + end function + function fn2(x, y) + real, intent(in) :: x, y + real :: fn2 + fn2 = x + y + end function + subroutine sb3(x) + real :: x + print *, x + end subroutine +end subroutine