| ! { dg-do compile } |
| ! { dg-options "-fmax-errors=1000 -fcoarray=single" } |
| ! |
| ! PR fortran/18918 |
| ! |
| ! Coarray expressions. |
| ! |
| module mod2 |
| implicit none |
| type t |
| procedure(sub), pointer :: ppc |
| contains |
| procedure :: tbp => sub |
| end type t |
| type t2 |
| class(t), allocatable :: poly |
| end type t2 |
| contains |
| subroutine sub(this) |
| class(t), intent(in) :: this |
| end subroutine sub |
| end module mod2 |
| |
| subroutine procTest(y,z) |
| use mod2 |
| implicit none |
| type(t), save :: x[*] |
| type(t) :: y[*] |
| type(t2) :: z[*] |
| |
| x%ppc => sub |
| call x%ppc() ! OK |
| call x%tbp() ! OK |
| call x[1]%tbp ! OK, not polymorphic |
| ! Invalid per C726 |
| call x[1]%ppc ! { dg-error "Coindexed procedure-pointer component" } |
| |
| y%ppc => sub |
| call y%ppc() ! OK |
| call y%tbp() ! OK |
| call y[1]%tbp ! OK, coindexed polymorphic object but not poly. subobj. |
| call y[1]%ppc ! { dg-error "Coindexed procedure-pointer component" } |
| |
| ! Invalid per C1229 |
| z%poly%ppc => sub |
| call z%poly%ppc() ! OK |
| call z%poly%tbp() ! OK |
| call z[1]%poly%tbp ! { dg-error "Polymorphic subobject of coindexed" } |
| call z[1]%poly%ppc ! { dg-error "Coindexed procedure-pointer component" } |
| end subroutine procTest |
| |
| |
| module m |
| type t1 |
| integer, pointer :: p |
| end type t1 |
| type t2 |
| integer :: i |
| end type t2 |
| type t |
| integer, allocatable :: a[:] |
| type(t1), allocatable :: b[:] |
| type(t2), allocatable :: c[:] |
| end type t |
| contains |
| pure subroutine p2(x) |
| integer, intent(inout) :: x |
| end subroutine p2 |
| pure subroutine p3(x) |
| integer, pointer :: x |
| end subroutine p3 |
| pure subroutine p1(x) |
| type(t), intent(inout) :: x |
| integer, target :: tgt1 |
| x%a = 5 |
| x%a[6] = 9 ! { dg-error "Assignment to coindexed variable" } |
| x%b%p => tgt1 |
| x%b[1]%p => tgt1 ! { dg-error "shall not have a coindex" } |
| x%b%p => x%b[1]%p ! { dg-error "shall not have a coindex" } |
| x%b = t1(x%b[1]%p) ! { dg-error "Coindexed expression to pointer component" } |
| x%b = x%b[1] ! { dg-error "derived type variable with a POINTER component in a PURE" } |
| call p2 (x%c[1]%i) ! { dg-error "Coindexed actual argument" } |
| call p3 (x%b[1]%p) ! { dg-error "to pointer dummy" } |
| end subroutine p1 |
| subroutine nonPtr() |
| type(t1), save :: a[*] |
| type(t2), save :: b[*] |
| integer, target :: tgt1 |
| a%p => tgt1 |
| a[1]%p => tgt1 ! { dg-error "shall not have a coindex" } |
| a%p => a[2]%p ! { dg-error "shall not have a coindex" } |
| a = t1(a[1]%p) ! { dg-error "Coindexed expression to pointer component" } |
| call p2 (b[1]%i) ! OK |
| call p2 (a[1]%p) ! OK - pointer target and not pointer |
| end subroutine nonPtr |
| end module m |
| |
| |
| module mmm3 |
| type t |
| integer, allocatable :: a(:) |
| end type t |
| contains |
| subroutine assign(x) |
| type(t) :: x[*] |
| allocate(x%a(3)) |
| x%a = [ 1, 2, 3] |
| x[1]%a = [ 1, 2, 3] ! OK - if shapes are the same, otherwise wrong |
| ! (no reallocate on assignment) |
| end subroutine assign |
| subroutine assign2(x,y) |
| type(t),allocatable :: x[:] |
| type(t) :: y |
| x = y |
| x[1] = y ! { dg-error "must not have an allocatable ultimate component" } |
| end subroutine assign2 |
| end module mmm3 |
| |
| |
| module mmm4 |
| implicit none |
| contains |
| subroutine t1(x) |
| integer :: x(1) |
| end subroutine t1 |
| subroutine t3(x) |
| character :: x(*) |
| end subroutine t3 |
| subroutine t2() |
| integer, save :: x[*] |
| integer, save :: y(1)[*] |
| character(len=20), save :: z[*] |
| |
| call t1(x) ! { dg-error "Rank mismatch" } |
| call t1(x[1]) ! { dg-error "Rank mismatch" } |
| |
| call t1(y(1)) ! OK |
| call t1(y(1)[1]) ! { dg-error "Rank mismatch" } |
| |
| call t3(z) ! OK |
| call t3(z[1]) ! { dg-error "Rank mismatch" } |
| end subroutine t2 |
| end module mmm4 |
| |
| |
| subroutine tfgh() |
| integer :: i(2) |
| DATA i/(i, i=1,2)/ ! { dg-error "Syntax error in DATA" } |
| do i = 1, 5 ! { dg-error "cannot be an array" } |
| end do ! { dg-error "Expecting END SUBROUTINE" } |
| end subroutine tfgh |
| |
| subroutine tfgh2() |
| integer, save :: x[*] |
| integer :: i(2) |
| DATA i/(x, x=1,2)/ ! { dg-error "Syntax error in DATA" } |
| do x = 1, 5 ! { dg-error "cannot be a coarray" } |
| end do ! { dg-error "Expecting END SUBROUTINE" } |
| end subroutine tfgh2 |
| |
| |
| subroutine f4f4() |
| type t |
| procedure(), pointer, nopass :: ppt => null() |
| end type t |
| external foo |
| type(t), save :: x[*] |
| x%ppt => foo |
| x[1]%ppt => foo ! { dg-error "shall not have a coindex" } |
| end subroutine f4f4 |
| |
| |
| subroutine corank() |
| integer, allocatable :: a[:,:] |
| call one(a) ! OK |
| call two(a) ! { dg-error "Corank mismatch in argument" } |
| contains |
| subroutine one(x) |
| integer :: x[*] |
| end subroutine one |
| subroutine two(x) |
| integer, allocatable :: x[:] |
| end subroutine two |
| end subroutine corank |
| |
| subroutine assign42() |
| integer, allocatable :: z(:)[:] |
| z(:)[1] = z |
| end subroutine assign42 |