Files
clang-p2996/flang/test/Semantics/doconcurrent09.f90
Peter Klausler bd92bca535 [flang] Fix purity testing for generic calls
The purity or impurity of a call to a generic interface
depends on the attributes of the specific procedure or specific
binding.  Change expression analysis of calls to generic interfaces
to replace the symbol in the parse tree with the specific procedure
or binding; this ensures that later checking for purity in
DO CONCURRENT and other contexts will be accurate.

Remove an "XFAIL" from a test that now passes again with this fix.

Differential Revision: https://reviews.llvm.org/D126150
2022-05-24 13:40:25 -07:00

48 lines
1.2 KiB
Fortran

! RUN: %python %S/test_errors.py %s %flang_fc1
! Ensure that DO CONCURRENT purity checks apply to specific procedures
! in the case of calls to generic interfaces.
module m
interface purity
module procedure :: ps, ips
end interface
type t
contains
procedure :: pb, ipb
generic :: purity => pb, ipb
end type
contains
pure subroutine ps(n)
integer, intent(in) :: n
end subroutine
impure subroutine ips(a)
real, intent(in) :: a
end subroutine
pure subroutine pb(x,n)
class(t), intent(in) :: x
integer, intent(in) :: n
end subroutine
impure subroutine ipb(x,n)
class(t), intent(in) :: x
real, intent(in) :: n
end subroutine
end module
program test
use m
type(t) :: x
do concurrent (j=1:1)
call ps(1) ! ok
call purity(1) ! ok
!ERROR: Call to an impure procedure is not allowed in DO CONCURRENT
call purity(1.)
!ERROR: Call to an impure procedure is not allowed in DO CONCURRENT
call ips(1.)
call x%pb(1) ! ok
call x%purity(1) ! ok
!ERROR: Call to an impure procedure component is not allowed in DO CONCURRENT
call x%purity(1.)
!ERROR: Call to an impure procedure component is not allowed in DO CONCURRENT
call x%ipb(1.)
end do
end program