Files
clang-p2996/flang/test/Semantics/call42.f90
Peter Klausler 70cbedcd6e [flang] Catch errors with INTENT(OUT) assumed rank dummy arguments (#111204)
Emit an error when an actual argument with potentially unknown size
(assumed size, or non-pointer non-allocatable assumed rank) with any
risk of needing initialization, finalization, or destruction is
associated with an INTENT(OUT) dummy argument with assumed rank.

Emit an optional portability warning for cases where the type is known
to be safe from needing initialization, finalization, or destruction,
since it's not conforming and might elicit an error from other
compilers.

Fixes https://github.com/llvm/llvm-project/issues/111120.
2024-10-07 13:17:45 -07:00

139 lines
11 KiB
Fortran

! RUN: %python %S/test_errors.py %s %flang_fc1 -pedantic
module m
type boring
end type
type hasAlloc
real, allocatable :: x
end type
type hasInit
real :: x = 1.
end type
type hasFinal
contains
final final
end type
contains
elemental subroutine final(x)
type(hasFinal), intent(in out) :: x
end
recursive subroutine typeOutAssumedRank(a,b,c,d)
type(boring), intent(out) :: a(..)
type(hasAlloc), intent(out) :: b(..)
type(hasInit), intent(out) :: c(..)
type(hasFinal), intent(out) :: d(..)
!PORTABILITY: Assumed-rank actual argument should not be associated with INTENT(OUT) assumed-rank dummy argument
!ERROR: Assumed-rank actual argument may not be associated with INTENT(OUT) assumed-rank dummy argument requiring finalization, destruction, or initialization
!ERROR: Assumed-rank actual argument may not be associated with INTENT(OUT) assumed-rank dummy argument requiring finalization, destruction, or initialization
!ERROR: Assumed-rank actual argument may not be associated with INTENT(OUT) assumed-rank dummy argument requiring finalization, destruction, or initialization
call typeOutAssumedRank(a, b, c, d)
!PORTABILITY: Assumed-rank actual argument should not be associated with INTENT(OUT) assumed-rank dummy argument
!ERROR: Assumed-rank actual argument may not be associated with INTENT(OUT) assumed-rank dummy argument requiring finalization, destruction, or initialization
!ERROR: Assumed-rank actual argument may not be associated with INTENT(OUT) assumed-rank dummy argument requiring finalization, destruction, or initialization
!ERROR: Assumed-rank actual argument may not be associated with INTENT(OUT) assumed-rank dummy argument requiring finalization, destruction, or initialization
call classOutAssumedRank(a, b, c, d)
!PORTABILITY: Assumed-rank actual argument should not be associated with INTENT(OUT) assumed-rank dummy argument
!ERROR: Assumed-rank actual argument may not be associated with INTENT(OUT) assumed-rank dummy argument requiring finalization, destruction, or initialization
!ERROR: Assumed-rank actual argument may not be associated with INTENT(OUT) assumed-rank dummy argument requiring finalization, destruction, or initialization
!ERROR: Assumed-rank actual argument may not be associated with INTENT(OUT) assumed-rank dummy argument requiring finalization, destruction, or initialization
call unlimitedOutAssumedRank(a, b, c, d)
end
recursive subroutine typeOutAssumedRankAlloc(a,b,c,d)
type(boring), intent(out), allocatable :: a(..)
type(hasAlloc), intent(out), allocatable :: b(..)
type(hasInit), intent(out), allocatable :: c(..)
type(hasFinal), intent(out), allocatable :: d(..)
call typeOutAssumedRank(a, b, c, d)
call typeOutAssumedRankAlloc(a, b, c, d)
end
recursive subroutine classOutAssumedRank(a,b,c,d)
class(boring), intent(out) :: a(..)
class(hasAlloc), intent(out) :: b(..)
class(hasInit), intent(out) :: c(..)
class(hasFinal), intent(out) :: d(..)
!ERROR: Assumed-rank actual argument may not be associated with INTENT(OUT) assumed-rank dummy argument requiring finalization, destruction, or initialization
!ERROR: Assumed-rank actual argument may not be associated with INTENT(OUT) assumed-rank dummy argument requiring finalization, destruction, or initialization
!ERROR: Assumed-rank actual argument may not be associated with INTENT(OUT) assumed-rank dummy argument requiring finalization, destruction, or initialization
!ERROR: Assumed-rank actual argument may not be associated with INTENT(OUT) assumed-rank dummy argument requiring finalization, destruction, or initialization
call typeOutAssumedRank(a, b, c, d)
!ERROR: Assumed-rank actual argument may not be associated with INTENT(OUT) assumed-rank dummy argument requiring finalization, destruction, or initialization
!ERROR: Assumed-rank actual argument may not be associated with INTENT(OUT) assumed-rank dummy argument requiring finalization, destruction, or initialization
!ERROR: Assumed-rank actual argument may not be associated with INTENT(OUT) assumed-rank dummy argument requiring finalization, destruction, or initialization
!ERROR: Assumed-rank actual argument may not be associated with INTENT(OUT) assumed-rank dummy argument requiring finalization, destruction, or initialization
call classOutAssumedRank(a, b, c, d)
!ERROR: Assumed-rank actual argument may not be associated with INTENT(OUT) assumed-rank dummy argument requiring finalization, destruction, or initialization
!ERROR: Assumed-rank actual argument may not be associated with INTENT(OUT) assumed-rank dummy argument requiring finalization, destruction, or initialization
!ERROR: Assumed-rank actual argument may not be associated with INTENT(OUT) assumed-rank dummy argument requiring finalization, destruction, or initialization
!ERROR: Assumed-rank actual argument may not be associated with INTENT(OUT) assumed-rank dummy argument requiring finalization, destruction, or initialization
call unlimitedOutAssumedRank(a, b, c, d)
end
recursive subroutine classOutAssumedRankAlloc(a,b,c,d)
class(boring), intent(out), allocatable :: a(..)
class(hasAlloc), intent(out), allocatable :: b(..)
class(hasInit), intent(out), allocatable :: c(..)
class(hasFinal), intent(out), allocatable :: d(..)
call classOutAssumedRank(a, b, c, d)
call classOutAssumedRankAlloc(a, b, c, d)
call unlimitedOutAssumedRank(a, b, c, d)
end
recursive subroutine unlimitedOutAssumedRank(a,b,c,d)
class(*), intent(out) :: a(..), b(..), c(..), d(..)
!ERROR: Assumed-rank actual argument may not be associated with INTENT(OUT) assumed-rank dummy argument requiring finalization, destruction, or initialization
!ERROR: Assumed-rank actual argument may not be associated with INTENT(OUT) assumed-rank dummy argument requiring finalization, destruction, or initialization
!ERROR: Assumed-rank actual argument may not be associated with INTENT(OUT) assumed-rank dummy argument requiring finalization, destruction, or initialization
!ERROR: Assumed-rank actual argument may not be associated with INTENT(OUT) assumed-rank dummy argument requiring finalization, destruction, or initialization
call unlimitedOutAssumedRank(a, b, c, d)
end
recursive subroutine unlimitedOutAssumedRankAlloc(a,b,c,d)
class(*), intent(out), allocatable :: a(..), b(..), c(..), d(..)
call unlimitedOutAssumedRank(a, b, c, d)
call unlimitedOutAssumedRankAlloc(a, b, c, d)
end
subroutine typeAssumedSize(a,b,c,d)
type(boring) a(*)
type(hasAlloc) b(*)
type(hasInit) c(*)
type(hasFinal) d(*)
!PORTABILITY: Assumed-size actual argument should not be associated with INTENT(OUT) assumed-rank dummy argument
!ERROR: Assumed-size actual argument may not be associated with INTENT(OUT) assumed-rank dummy argument requiring finalization, destruction, or initialization
!ERROR: Assumed-size actual argument may not be associated with INTENT(OUT) assumed-rank dummy argument requiring finalization, destruction, or initialization
!ERROR: Assumed-size actual argument may not be associated with INTENT(OUT) assumed-rank dummy argument requiring finalization, destruction, or initialization
call typeOutAssumedRank(a,b,c,d)
!PORTABILITY: Assumed-size actual argument should not be associated with INTENT(OUT) assumed-rank dummy argument
!ERROR: Assumed-size actual argument may not be associated with INTENT(OUT) assumed-rank dummy argument requiring finalization, destruction, or initialization
!ERROR: Assumed-size actual argument may not be associated with INTENT(OUT) assumed-rank dummy argument requiring finalization, destruction, or initialization
!ERROR: Assumed-size actual argument may not be associated with INTENT(OUT) assumed-rank dummy argument requiring finalization, destruction, or initialization
call classOutAssumedRank(a,b,c,d)
!PORTABILITY: Assumed-size actual argument should not be associated with INTENT(OUT) assumed-rank dummy argument
!ERROR: Assumed-size actual argument may not be associated with INTENT(OUT) assumed-rank dummy argument requiring finalization, destruction, or initialization
!ERROR: Assumed-size actual argument may not be associated with INTENT(OUT) assumed-rank dummy argument requiring finalization, destruction, or initialization
!ERROR: Assumed-size actual argument may not be associated with INTENT(OUT) assumed-rank dummy argument requiring finalization, destruction, or initialization
call unlimitedOutAssumedRank(a,b,c,d)
end
subroutine classAssumedSize(a,b,c,d)
class(boring) a(*)
class(hasAlloc) b(*)
class(hasInit) c(*)
class(hasFinal) d(*)
!ERROR: Assumed-size actual argument may not be associated with INTENT(OUT) assumed-rank dummy argument requiring finalization, destruction, or initialization
!ERROR: Assumed-size actual argument may not be associated with INTENT(OUT) assumed-rank dummy argument requiring finalization, destruction, or initialization
!ERROR: Assumed-size actual argument may not be associated with INTENT(OUT) assumed-rank dummy argument requiring finalization, destruction, or initialization
!ERROR: Assumed-size actual argument may not be associated with INTENT(OUT) assumed-rank dummy argument requiring finalization, destruction, or initialization
call classOutAssumedRank(a,b,c,d)
!ERROR: Assumed-size actual argument may not be associated with INTENT(OUT) assumed-rank dummy argument requiring finalization, destruction, or initialization
!ERROR: Assumed-size actual argument may not be associated with INTENT(OUT) assumed-rank dummy argument requiring finalization, destruction, or initialization
!ERROR: Assumed-size actual argument may not be associated with INTENT(OUT) assumed-rank dummy argument requiring finalization, destruction, or initialization
!ERROR: Assumed-size actual argument may not be associated with INTENT(OUT) assumed-rank dummy argument requiring finalization, destruction, or initialization
call unlimitedOutAssumedRank(a,b,c,d)
end
subroutine unlimitedAssumedSize(a,b,c,d)
class(*) a(*), b(*), c(*), d(*)
!ERROR: Assumed-size actual argument may not be associated with INTENT(OUT) assumed-rank dummy argument requiring finalization, destruction, or initialization
!ERROR: Assumed-size actual argument may not be associated with INTENT(OUT) assumed-rank dummy argument requiring finalization, destruction, or initialization
!ERROR: Assumed-size actual argument may not be associated with INTENT(OUT) assumed-rank dummy argument requiring finalization, destruction, or initialization
!ERROR: Assumed-size actual argument may not be associated with INTENT(OUT) assumed-rank dummy argument requiring finalization, destruction, or initialization
call unlimitedOutAssumedRank(a, b, c, d)
end
end