Skip resolving implicit types for OpenMP declarative directives, to allow them to appear before type declarations, which is supported by several compilers. This was discussed in https://discourse.llvm.org/t/rfc-openmp-should-type-declaration-be-allowed-after-threadprivate/81345. This fixes the semantic errors of https://github.com/llvm/llvm-project/issues/106021.
57 lines
1.1 KiB
Fortran
57 lines
1.1 KiB
Fortran
! RUN: %flang -fsyntax-only -fopenmp %s 2>&1
|
|
|
|
! Check that OpenMP declarative directives can be used with objects that have
|
|
! an incomplete type.
|
|
|
|
subroutine test_decl
|
|
! OMPv5.2 5.2 threadprivate
|
|
! OMPv5.2 6.5 allocate
|
|
implicit none
|
|
save :: x1, y1
|
|
!$omp threadprivate(x1)
|
|
!$omp allocate(y1)
|
|
integer :: x1, y1
|
|
|
|
! OMPv5.2 7.7 declare-simd
|
|
external :: simd_func
|
|
!$omp declare simd(simd_func)
|
|
logical :: simd_func
|
|
|
|
! OMPv5.2 7.8.1 declare-target
|
|
allocatable :: j
|
|
!$omp declare target(j)
|
|
save :: j
|
|
real(kind=8) :: j(:)
|
|
|
|
! OMPv5.2 5.5.11 declare-reduction - crashes
|
|
!external :: my_add_red
|
|
!!$omp declare reduction(my_add_red : integer : my_add_red(omp_out, omp_in)) &
|
|
!!$omp& initializer(omp_priv=0)
|
|
!integer :: my_add_red
|
|
end subroutine
|
|
|
|
subroutine test_decl2
|
|
save x1, y1
|
|
!$omp threadprivate(x1)
|
|
!$omp allocate(y1)
|
|
integer :: x1, y1
|
|
|
|
! implicit decl
|
|
!$omp threadprivate(x2)
|
|
!$omp allocate(y2)
|
|
save x2, y2
|
|
end subroutine
|
|
|
|
module m1
|
|
! implicit decl
|
|
!$omp threadprivate(x, y, z)
|
|
integer :: y
|
|
real :: z
|
|
|
|
contains
|
|
subroutine sub
|
|
!$omp parallel copyin(x, y, z)
|
|
!$omp end parallel
|
|
end subroutine
|
|
end module
|