Peter Klausler 3f6e0c24e6 [flang] Move SAVE attribute checks to declaration checking
Constraint checking for explicit SAVE attributes is more
accurate when done along with other declaration checking, rather
than on the fly during name resolution.  This allows us to
catch attempts to attach explicit SAVE attributes to anything
that can't have one (constraints C859, C860).

Also delete `IsSave()`, whose few remaining uses were changed to the
more general `IsSaved()` predicate that seems more correct for
those uses, returning true for both explicit and implied SAVE
attributes.

Differential Revision: https://reviews.llvm.org/D146579
2023-03-27 15:53:44 -07:00

73 lines
1.9 KiB
Fortran

! RUN: %python %S/test_errors.py %s %flang_fc1
!ERROR: The function result variable 'f1' may not have an explicit SAVE attribute
function f1(x, y)
!ERROR: The dummy argument 'x' may not have an explicit SAVE attribute
integer x
save x,y
!ERROR: The dummy argument 'y' may not have an explicit SAVE attribute
integer y
save f1
end
!ERROR: The entity 'f2' with an explicit SAVE attribute must be a variable, procedure pointer, or COMMON block
function f2(x, y) result(r)
save f2
!ERROR: The function result variable 'r' may not have an explicit SAVE attribute
real, save :: r
!ERROR: The dummy argument 'x' may not have an explicit SAVE attribute
complex, save :: x
allocatable :: y
!ERROR: The dummy argument 'y' may not have an explicit SAVE attribute
integer :: y
save :: y
end
! SAVE statement should not trigger the above errors
function f2b(x, y)
real :: x, y
save
end
subroutine s3(x)
!ERROR: The dummy argument 'x' may not have an explicit SAVE attribute
procedure(integer), pointer, save :: x
!ERROR: The entity 'y' with an explicit SAVE attribute must be a variable, procedure pointer, or COMMON block
procedure(integer), save :: y
end
subroutine s4
!WARNING: Explicit SAVE of 'z' is redundant due to global SAVE statement
save z
save
procedure(integer), pointer :: x
!WARNING: Explicit SAVE of 'x' is redundant due to global SAVE statement
save :: x
!WARNING: Explicit SAVE of 'y' is redundant due to global SAVE statement
integer, save :: y
end
subroutine s5
implicit none
integer x
block
!ERROR: No explicit type declared for 'x'
save x
end block
end
subroutine s7
!ERROR: 'x' appears as a COMMON block in a SAVE statement but not in a COMMON statement
save /x/
end
subroutine s8a(n)
integer :: n
real :: x(n) ! OK: save statement doesn't affect x
save
end
subroutine s8b(n)
integer :: n
!ERROR: The automatic object 'x' may not have an explicit SAVE attribute
real, save :: x(n)
end