blob: 64870cd79f42ce862e3bbde9d54ac959768bc1a8 [file] [edit]
! RUN: %python %S/../test_errors.py %s %flang -fopenmp -fopenmp-version=60
! OpenMP 6.0, 9.8 declare_simd Directive, Fortran restriction:
! "Any declare_simd directive must appear in the specification part of a
! subroutine subprogram, function subprogram, or interface body to which it
! applies."
module m
procedure() :: ext
!ERROR: DECLARE_SIMD directive must appear in the specification part of a subroutine subprogram, function subprogram, or interface body
!$omp declare simd
!ERROR: DECLARE_SIMD directive must appear in the specification part of a subroutine subprogram, function subprogram, or interface body
!$omp declare_simd(ext)
contains
! Ok: module subprogram.
subroutine mod_sub(i)
integer :: i
!$omp declare simd(mod_sub) linear(i:1)
i = i + 1
end subroutine
! Ok: module function.
integer function mod_fun(i)
integer :: i
!$omp declare_simd
mod_fun = i
end function
end module
submodule (m) sm
!ERROR: DECLARE_SIMD directive must appear in the specification part of a subroutine subprogram, function subprogram, or interface body
!$omp declare simd
end submodule
block data bd
integer :: x
common /blk/ x
!ERROR: DECLARE_SIMD directive must appear in the specification part of a subroutine subprogram, function subprogram, or interface body
!$omp declare simd
data x /0/
end block data
program main
!ERROR: DECLARE_SIMD directive must appear in the specification part of a subroutine subprogram, function subprogram, or interface body
!$omp declare simd
end program
! The specification part of a BLOCK construct is not the specification part of
! the enclosing subprogram.
subroutine in_block(i)
integer :: i
block
!ERROR: DECLARE_SIMD directive must appear in the specification part of a subroutine subprogram, function subprogram, or interface body
!$omp declare simd
i = i + 1
end block
end subroutine
! Ok: external subroutine.
subroutine ext_sub(i)
integer :: i
!$omp declare simd(ext_sub) linear(i:1)
i = i + 1
end subroutine
! Ok: external function, with an internal subprogram.
integer function ext_fun(i)
integer :: i
!$omp declare simd(ext_fun)
ext_fun = inner(i)
contains
! Ok: internal subprogram.
integer function inner(j)
integer :: j
!$omp declare simd(inner) linear(j:1)
inner = j
end function
end function
! Ok: interface body (the directive is ignored, hence the warning).
subroutine has_interface
interface
subroutine iface_sub(i)
!WARNING: 'DECLARE SIMD' directive in an interface body has no effect [-Wopenmp-usage]
!$omp declare simd(iface_sub) linear(i:1)
integer :: i
end subroutine
end interface
end subroutine