| ! { dg-do run } |
| ! { dg-options "-fcheck=pointer" } |
| ! |
| ! { dg-shouldfail "pointer check" } |
| ! { dg-output ".*At line 104 of file .*Fortran runtime error: Pointer actual argument 'a' is not associated.*" } |
| ! |
| ! PR fortran/40604 |
| ! |
| ! The following cases are all valid, but were failing |
| ! for one or the other reason. |
| ! |
| ! Contributed by Janus Weil and Tobias Burnus. |
| ! |
| |
| subroutine test1() |
| call test(uec=-1) |
| contains |
| subroutine test(str,uec) |
| implicit none |
| character*(*), intent(in), optional:: str |
| integer, intent(in), optional :: uec |
| end subroutine |
| end subroutine test1 |
| |
| module m |
| interface matrixMult |
| Module procedure matrixMult_C2 |
| End Interface |
| contains |
| subroutine test |
| implicit none |
| complex, dimension(0:3,0:3) :: m1,m2 |
| print *,Trace(MatrixMult(m1,m2)) |
| end subroutine |
| complex function trace(a) |
| implicit none |
| complex, intent(in), dimension(0:3,0:3) :: a |
| end function trace |
| function matrixMult_C2(a,b) result(matrix) |
| implicit none |
| complex, dimension(0:3,0:3) :: matrix,a,b |
| end function matrixMult_C2 |
| end module m |
| |
| SUBROUTINE plotdop(amat) |
| IMPLICIT NONE |
| REAL, INTENT (IN) :: amat(3,3) |
| integer :: i1 |
| real :: pt(3) |
| i1 = 1 |
| pt = MATMUL(amat,(/i1,i1,i1/)) |
| END SUBROUTINE plotdop |
| |
| FUNCTION evaluateFirst(s,n)result(number) |
| IMPLICIT NONE |
| CHARACTER(len =*), INTENT(inout) :: s |
| INTEGER,OPTIONAL :: n |
| REAL :: number |
| number = 1.1 |
| end function |
| |
| SUBROUTINE rw_inp(scpos) |
| IMPLICIT NONE |
| REAL scpos |
| |
| interface |
| FUNCTION evaluateFirst(s,n)result(number) |
| IMPLICIT NONE |
| CHARACTER(len =*), INTENT(inout) :: s |
| INTEGER,OPTIONAL :: n |
| REAL :: number |
| end function |
| end interface |
| |
| CHARACTER(len=100) :: line |
| scpos = evaluatefirst(line) |
| END SUBROUTINE rw_inp |
| |
| program test |
| integer, pointer :: a |
| ! nullify(a) |
| allocate(a) |
| a = 1 |
| call sub1a(a) |
| call sub1b(a) |
| call sub1c() |
| contains |
| subroutine sub1a(a) |
| integer, pointer :: a |
| call sub2(a) |
| call sub3(a) |
| call sub4(a) |
| end subroutine sub1a |
| subroutine sub1b(a) |
| integer, pointer,optional :: a |
| call sub2(a) |
| call sub3(a) |
| call sub4(a) |
| end subroutine sub1b |
| subroutine sub1c(a) |
| integer, pointer,optional :: a |
| call sub4(a) |
| ! call sub2(a) ! << Invalid - working correctly, but not allowed in F2003 |
| call sub3(a) ! << INVALID |
| end subroutine sub1c |
| subroutine sub4(b) |
| integer, optional,pointer :: b |
| end subroutine |
| subroutine sub2(b) |
| integer, optional :: b |
| end subroutine |
| subroutine sub3(b) |
| integer :: b |
| end subroutine |
| end |