| ! RUN: %S/test_errors.sh %s %t %f18 |
| ! Test 15.5.2.4 constraints and restrictions for non-POINTER non-ALLOCATABLE |
| ! dummy arguments. |
| |
| module m01 |
| type :: t |
| end type |
| type :: pdt(n) |
| integer, len :: n |
| end type |
| type :: tbp |
| contains |
| procedure :: binding => subr01 |
| end type |
| type :: final |
| contains |
| final :: subr02 |
| end type |
| type :: alloc |
| real, allocatable :: a(:) |
| end type |
| type :: ultimateCoarray |
| real, allocatable :: a[:] |
| end type |
| |
| contains |
| |
| subroutine subr01(this) |
| class(tbp), intent(in) :: this |
| end subroutine |
| subroutine subr02(this) |
| type(final), intent(inout) :: this |
| end subroutine |
| |
| subroutine poly(x) |
| class(t), intent(in) :: x |
| end subroutine |
| subroutine polyassumedsize(x) |
| class(t), intent(in) :: x(*) |
| end subroutine |
| subroutine assumedsize(x) |
| real :: x(*) |
| end subroutine |
| subroutine assumedrank(x) |
| real :: x(..) |
| end subroutine |
| subroutine assumedtypeandsize(x) |
| type(*) :: x(*) |
| end subroutine |
| subroutine assumedshape(x) |
| real :: x(:) |
| end subroutine |
| subroutine contiguous(x) |
| real, contiguous :: x(:) |
| end subroutine |
| subroutine intentout(x) |
| real, intent(out) :: x |
| end subroutine |
| subroutine intentinout(x) |
| real, intent(in out) :: x |
| end subroutine |
| subroutine asynchronous(x) |
| real, asynchronous :: x |
| end subroutine |
| subroutine asynchronousValue(x) |
| real, asynchronous, value :: x |
| end subroutine |
| subroutine volatile(x) |
| real, volatile :: x |
| end subroutine |
| subroutine pointer(x) |
| real, pointer :: x(:) |
| end subroutine |
| subroutine valueassumedsize(x) |
| real, intent(in) :: x(*) |
| end subroutine |
| subroutine volatileassumedsize(x) |
| real, volatile :: x(*) |
| end subroutine |
| subroutine volatilecontiguous(x) |
| real, volatile :: x(*) |
| end subroutine |
| |
| subroutine test01(x) ! 15.5.2.4(2) |
| class(t), intent(in) :: x[*] |
| !ERROR: Coindexed polymorphic object may not be associated with a polymorphic dummy argument 'x=' |
| call poly(x[1]) |
| end subroutine |
| |
| subroutine mono(x) |
| type(t), intent(in) :: x |
| end subroutine |
| subroutine test02(x) ! 15.5.2.4(2) |
| class(t), intent(in) :: x(*) |
| !ERROR: Assumed-size polymorphic array may not be associated with a monomorphic dummy argument 'x=' |
| call mono(x) |
| end subroutine |
| |
| subroutine typestar(x) |
| type(*), intent(in) :: x |
| end subroutine |
| subroutine test03 ! 15.5.2.4(2) |
| type(pdt(0)) :: x |
| !ERROR: Actual argument associated with TYPE(*) dummy argument 'x=' may not have a parameterized derived type |
| call typestar(x) |
| end subroutine |
| |
| subroutine test04 ! 15.5.2.4(2) |
| type(tbp) :: x |
| !ERROR: Actual argument associated with TYPE(*) dummy argument 'x=' may not have type-bound procedure 'binding' |
| call typestar(x) |
| end subroutine |
| |
| subroutine test05 ! 15.5.2.4(2) |
| type(final) :: x |
| !ERROR: Actual argument associated with TYPE(*) dummy argument 'x=' may not have derived type 'final' with FINAL subroutine 'subr02' |
| call typestar(x) |
| end subroutine |
| |
| subroutine ch2(x) |
| character(2), intent(in out) :: x |
| end subroutine |
| subroutine test06 ! 15.5.2.4(4) |
| character :: ch1 |
| ! The actual argument is converted to a padded expression. |
| !ERROR: Actual argument associated with INTENT(IN OUT) dummy argument 'x=' must be definable |
| call ch2(ch1) |
| end subroutine |
| |
| subroutine out01(x) |
| type(alloc) :: x |
| end subroutine |
| subroutine test07(x) ! 15.5.2.4(6) |
| type(alloc) :: x[*] |
| !ERROR: Coindexed actual argument with ALLOCATABLE ultimate component '%a' must be associated with a dummy argument 'x=' with VALUE or INTENT(IN) attributes |
| call out01(x[1]) |
| end subroutine |
| |
| subroutine test08(x) ! 15.5.2.4(13) |
| real :: x(1)[*] |
| !ERROR: Coindexed scalar actual argument must be associated with a scalar dummy argument 'x=' |
| call assumedsize(x(1)[1]) |
| end subroutine |
| |
| subroutine charray(x) |
| character :: x(10) |
| end subroutine |
| subroutine test09(ashape, polyarray, c) ! 15.5.2.4(14), 15.5.2.11 |
| real :: x, arr(10) |
| real, pointer :: p(:) |
| real :: ashape(:) |
| class(t) :: polyarray(*) |
| character(10) :: c(:) |
| !ERROR: Whole scalar actual argument may not be associated with a dummy argument 'x=' array |
| call assumedsize(x) |
| !ERROR: Scalar POINTER target may not be associated with a dummy argument 'x=' array |
| call assumedsize(p(1)) |
| !ERROR: Element of assumed-shape array may not be associated with a dummy argument 'x=' array |
| call assumedsize(ashape(1)) |
| !ERROR: Polymorphic scalar may not be associated with a dummy argument 'x=' array |
| call polyassumedsize(polyarray(1)) |
| call charray(c(1:1)) ! not an error if character |
| call assumedsize(arr(1)) ! not an error if element in sequence |
| call assumedrank(x) ! not an error |
| call assumedtypeandsize(x) ! not an error |
| end subroutine |
| |
| subroutine test10(a) ! 15.5.2.4(16) |
| real :: scalar, matrix(2,3) |
| real :: a(*) |
| !ERROR: Scalar actual argument may not be associated with assumed-shape dummy argument 'x=' |
| call assumedshape(scalar) |
| !ERROR: Rank of dummy argument is 1, but actual argument has rank 2 |
| call assumedshape(matrix) |
| !ERROR: Assumed-size array may not be associated with assumed-shape dummy argument 'x=' |
| call assumedshape(a) |
| end subroutine |
| |
| subroutine test11(in) ! C15.5.2.4(20) |
| real, intent(in) :: in |
| real :: x |
| x = 0. |
| !ERROR: Actual argument associated with INTENT(OUT) dummy argument 'x=' must be definable |
| call intentout(in) |
| !ERROR: Actual argument associated with INTENT(OUT) dummy argument 'x=' must be definable |
| call intentout(3.14159) |
| !ERROR: Actual argument associated with INTENT(OUT) dummy argument 'x=' must be definable |
| call intentout(in + 1.) |
| call intentout(x) ! ok |
| !ERROR: Actual argument associated with INTENT(OUT) dummy argument 'x=' must be definable |
| call intentout((x)) |
| !ERROR: Actual argument associated with INTENT(OUT) dummy argument 'count=' must be definable |
| call system_clock(count=2) |
| !ERROR: Actual argument associated with INTENT(IN OUT) dummy argument 'x=' must be definable |
| call intentinout(in) |
| !ERROR: Actual argument associated with INTENT(IN OUT) dummy argument 'x=' must be definable |
| call intentinout(3.14159) |
| !ERROR: Actual argument associated with INTENT(IN OUT) dummy argument 'x=' must be definable |
| call intentinout(in + 1.) |
| call intentinout(x) ! ok |
| !ERROR: Actual argument associated with INTENT(IN OUT) dummy argument 'x=' must be definable |
| call intentinout((x)) |
| !ERROR: Actual argument associated with INTENT(IN OUT) dummy argument 'exitstat=' must be definable |
| call execute_command_line(command="echo hello", exitstat=0) |
| end subroutine |
| |
| subroutine test12 ! 15.5.2.4(21) |
| real :: a(1) |
| integer :: j(1) |
| j(1) = 1 |
| !ERROR: Actual argument associated with INTENT(OUT) dummy argument 'x=' must be definable |
| call intentout(a(j)) |
| !ERROR: Actual argument associated with INTENT(IN OUT) dummy argument 'x=' must be definable |
| call intentinout(a(j)) |
| !ERROR: Actual argument associated with ASYNCHRONOUS dummy argument 'x=' must be definable |
| call asynchronous(a(j)) |
| !ERROR: Actual argument associated with VOLATILE dummy argument 'x=' must be definable |
| call volatile(a(j)) |
| end subroutine |
| |
| subroutine coarr(x) |
| type(ultimateCoarray):: x |
| end subroutine |
| subroutine volcoarr(x) |
| type(ultimateCoarray), volatile :: x |
| end subroutine |
| subroutine test13(a, b) ! 15.5.2.4(22) |
| type(ultimateCoarray) :: a |
| type(ultimateCoarray), volatile :: b |
| call coarr(a) ! ok |
| call volcoarr(b) ! ok |
| !ERROR: VOLATILE attribute must match for dummy argument 'x=' when actual argument has a coarray ultimate component '%a' |
| call coarr(b) |
| !ERROR: VOLATILE attribute must match for dummy argument 'x=' when actual argument has a coarray ultimate component '%a' |
| call volcoarr(a) |
| end subroutine |
| |
| subroutine test14(a,b,c,d) ! C1538 |
| real :: a[*] |
| real, asynchronous :: b[*] |
| real, volatile :: c[*] |
| real, asynchronous, volatile :: d[*] |
| call asynchronous(a[1]) ! ok |
| call volatile(a[1]) ! ok |
| call asynchronousValue(b[1]) ! ok |
| call asynchronousValue(c[1]) ! ok |
| call asynchronousValue(d[1]) ! ok |
| !ERROR: Coindexed ASYNCHRONOUS or VOLATILE actual argument may not be associated with dummy argument 'x=' with ASYNCHRONOUS or VOLATILE attributes unless VALUE |
| call asynchronous(b[1]) |
| !ERROR: Coindexed ASYNCHRONOUS or VOLATILE actual argument may not be associated with dummy argument 'x=' with ASYNCHRONOUS or VOLATILE attributes unless VALUE |
| call volatile(b[1]) |
| !ERROR: Coindexed ASYNCHRONOUS or VOLATILE actual argument may not be associated with dummy argument 'x=' with ASYNCHRONOUS or VOLATILE attributes unless VALUE |
| call asynchronous(c[1]) |
| !ERROR: Coindexed ASYNCHRONOUS or VOLATILE actual argument may not be associated with dummy argument 'x=' with ASYNCHRONOUS or VOLATILE attributes unless VALUE |
| call volatile(c[1]) |
| !ERROR: Coindexed ASYNCHRONOUS or VOLATILE actual argument may not be associated with dummy argument 'x=' with ASYNCHRONOUS or VOLATILE attributes unless VALUE |
| call asynchronous(d[1]) |
| !ERROR: Coindexed ASYNCHRONOUS or VOLATILE actual argument may not be associated with dummy argument 'x=' with ASYNCHRONOUS or VOLATILE attributes unless VALUE |
| call volatile(d[1]) |
| end subroutine |
| |
| subroutine test15() ! C1539 |
| real, pointer :: a(:) |
| real, asynchronous :: b(10) |
| real, volatile :: c(10) |
| real, asynchronous, volatile :: d(10) |
| call assumedsize(a(::2)) ! ok |
| call contiguous(a(::2)) ! ok |
| call valueassumedsize(a(::2)) ! ok |
| call valueassumedsize(b(::2)) ! ok |
| call valueassumedsize(c(::2)) ! ok |
| call valueassumedsize(d(::2)) ! ok |
| !ERROR: ASYNCHRONOUS or VOLATILE actual argument that is not simply contiguous may not be associated with a contiguous dummy argument 'x=' |
| call volatileassumedsize(b(::2)) |
| !ERROR: ASYNCHRONOUS or VOLATILE actual argument that is not simply contiguous may not be associated with a contiguous dummy argument 'x=' |
| call volatilecontiguous(b(::2)) |
| !ERROR: ASYNCHRONOUS or VOLATILE actual argument that is not simply contiguous may not be associated with a contiguous dummy argument 'x=' |
| call volatileassumedsize(c(::2)) |
| !ERROR: ASYNCHRONOUS or VOLATILE actual argument that is not simply contiguous may not be associated with a contiguous dummy argument 'x=' |
| call volatilecontiguous(c(::2)) |
| !ERROR: ASYNCHRONOUS or VOLATILE actual argument that is not simply contiguous may not be associated with a contiguous dummy argument 'x=' |
| call volatileassumedsize(d(::2)) |
| !ERROR: ASYNCHRONOUS or VOLATILE actual argument that is not simply contiguous may not be associated with a contiguous dummy argument 'x=' |
| call volatilecontiguous(d(::2)) |
| end subroutine |
| |
| subroutine test16() ! C1540 |
| real, pointer :: a(:) |
| real, asynchronous, pointer :: b(:) |
| real, volatile, pointer :: c(:) |
| real, asynchronous, volatile, pointer :: d(:) |
| call assumedsize(a) ! ok |
| call contiguous(a) ! ok |
| call pointer(a) ! ok |
| call pointer(b) ! ok |
| call pointer(c) ! ok |
| call pointer(d) ! ok |
| call valueassumedsize(a) ! ok |
| call valueassumedsize(b) ! ok |
| call valueassumedsize(c) ! ok |
| call valueassumedsize(d) ! ok |
| !ERROR: ASYNCHRONOUS or VOLATILE actual argument that is not simply contiguous may not be associated with a contiguous dummy argument 'x=' |
| call volatileassumedsize(b) |
| !ERROR: ASYNCHRONOUS or VOLATILE actual argument that is not simply contiguous may not be associated with a contiguous dummy argument 'x=' |
| call volatilecontiguous(b) |
| !ERROR: ASYNCHRONOUS or VOLATILE actual argument that is not simply contiguous may not be associated with a contiguous dummy argument 'x=' |
| call volatileassumedsize(c) |
| !ERROR: ASYNCHRONOUS or VOLATILE actual argument that is not simply contiguous may not be associated with a contiguous dummy argument 'x=' |
| call volatilecontiguous(c) |
| !ERROR: ASYNCHRONOUS or VOLATILE actual argument that is not simply contiguous may not be associated with a contiguous dummy argument 'x=' |
| call volatileassumedsize(d) |
| !ERROR: ASYNCHRONOUS or VOLATILE actual argument that is not simply contiguous may not be associated with a contiguous dummy argument 'x=' |
| call volatilecontiguous(d) |
| end subroutine |
| |
| end module |