Peter Klausler 26ac30bcec
[flang] Accept initialized SAVE local in specification expression (#107656)
Specification expressions may contain references to dummy arguments,
host objects, module variables, and variables in COMMON blocks, since
they will have values on entry to the scope. A local variable with a
initializer and the SAVE attribute (which will always be implied by an
explicit initialization) will also always work, and is accepted by at
least one other compiler, so accept it with a warning.
2024-09-10 14:13:09 -07:00

73 lines
1.9 KiB
Fortran

! RUN: %python %S/test_errors.py %s %flang_fc1 -pedantic
! Tests valid and invalid usage of forward references to procedures
! in specification expressions.
module m
interface ifn2
module procedure if2
end interface
interface ifn3
module procedure if3
end interface
!ERROR: Automatic data object 'a' may not appear in a module
real :: a(if1(1))
!ERROR: Automatic data object 'b' may not appear in a module
real :: b(ifn2(1))
!ERROR: Automatic data object 'c' may not appear in COMMON block /blk/
real :: c(if1(1))
!ERROR: Automatic data object 'd' may not appear in COMMON block //
real :: d(ifn2(1))
common /blk/c
common d
contains
subroutine t1(n)
integer :: iarr(if1(n))
end subroutine
pure integer function if1(n)
integer, intent(in) :: n
if1 = n
end function
subroutine t2(n)
integer :: iarr(ifn3(n)) ! should resolve to if3
end subroutine
pure integer function if2(n)
integer, intent(in) :: n
if2 = n
end function
pure integer function if3(n)
integer, intent(in) :: n
if3 = n
end function
end module
subroutine nester
!ERROR: The internal function 'if1' may not be referenced in a specification expression
real :: a(if1(1))
contains
subroutine t1(n)
!ERROR: The internal function 'if2' may not be referenced in a specification expression
integer :: iarr(if2(n))
end subroutine
pure integer function if1(n)
integer, intent(in) :: n
if1 = n
end function
pure integer function if2(n)
integer, intent(in) :: n
if2 = n
end function
end subroutine
block data
common /blk2/ n
data n/100/
!PORTABILITY: specification expression refers to local object 'n' (initialized and saved)
!ERROR: Automatic data object 'a' may not appear in a BLOCK DATA subprogram
real a(n)
end
program main
common /blk2/ n
!PORTABILITY: Automatic data object 'a' should not appear in the specification part of a main program
real a(n)
end