| ! { dg-do compile } |
| ! { dg-options "-fcoarray=lib" } |
| ! |
| ! Valid code - but currently not implemented for -fcoarray=lib; single okay |
| ! |
| subroutine one |
| implicit none |
| type t |
| integer, allocatable :: a |
| integer :: b |
| end type t |
| type t2 |
| type(t), allocatable :: caf2[:] |
| end type t2 |
| type(t), save :: caf[*],x |
| type(t2) :: y |
| |
| x = caf[4] ! OK, now |
| x%a = caf[4]%a ! OK, now |
| x%b = caf[4]%b ! OK |
| x = y%caf2[5] ! OK, now |
| x%a = y%caf2[4]%a ! OK, now |
| x%b = y%caf2[4]%b ! OK |
| end subroutine one |
| |
| subroutine two |
| implicit none |
| type t |
| integer, pointer :: a |
| integer :: b |
| end type t |
| type t2 |
| type(t), allocatable :: caf2[:] |
| end type t2 |
| type(t), save :: caf[*],x |
| type(t2) :: y |
| |
| x = caf[4] ! OK |
| x%a = caf[4]%a ! OK, now |
| x%b = caf[4]%b ! OK |
| x = y%caf2[5] ! OK |
| x%a = y%caf2[4]%a ! OK, now |
| x%b = y%caf2[4]%b ! OK |
| end subroutine two |
| |
| subroutine three |
| implicit none |
| type t |
| integer :: b |
| end type t |
| type t2 |
| type(t), allocatable :: caf2(:)[:] |
| end type t2 |
| type(t), save :: caf(10)[*] |
| integer :: x(10) |
| type(t2) :: y |
| |
| x(1) = caf(2)[4]%b ! OK |
| x(:) = caf(:)[4]%b ! OK now |
| |
| x(1) = y%caf2(2)[4]%b ! OK |
| x(:) = y%caf2(:)[4]%b ! OK now |
| end subroutine three |
| |
| subroutine four |
| implicit none |
| type t |
| integer, allocatable :: a |
| integer :: b |
| end type t |
| type t2 |
| class(t), allocatable :: caf2[:] |
| end type t2 |
| class(t), allocatable :: caf[:] ! { dg-error "Sorry, allocatable/pointer components in polymorphic" } |
| type(t) :: x |
| type(t2) :: y |
| |
| !x = caf[4] ! Unsupported - and ICEs in resolve_ordinary_assign, cf. PR fortran/65397 |
| x%a = caf[4]%a ! OK, now |
| x%b = caf[4]%b ! OK |
| !x = y%caf2[5] ! Unsupported - and ICEs in resolve_ordinary_assign, cf. PR fortran/65397 |
| x%a = y%caf2[4]%a ! Ok, now |
| x%b = y%caf2[4]%b ! OK |
| end subroutine four |
| |
| subroutine five |
| implicit none |
| type t |
| integer, pointer :: a |
| integer :: b |
| end type t |
| type t2 |
| class(t), allocatable :: caf2[:] |
| end type t2 |
| class(t), save, allocatable :: caf[:] ! { dg-error "Sorry, allocatable/pointer components in polymorphic" } |
| type(t) :: x |
| type(t2) :: y |
| |
| !x = caf[4] ! OK - but ICEs in resolve_ordinary_assign, cf. PR fortran/65397 |
| x%a = caf[4]%a ! OK, now |
| x%b = caf[4]%b ! OK |
| !x = y%caf2[5] ! OK - but ICEs in resolve_ordinary_assign, cf. PR fortran/65397 |
| x%a = y%caf2[4]%a ! OK, now |
| x%b = y%caf2[4]%b ! OK |
| end subroutine five |
| |
| subroutine six |
| implicit none |
| type t |
| integer :: b |
| end type t |
| type t2 |
| class(t), allocatable :: caf2(:)[:] |
| end type t2 |
| class(t), save, allocatable :: caf(:)[:] |
| integer :: x(10) |
| type(t2) :: y |
| |
| x(1) = caf(2)[4]%b ! OK |
| x(:) = caf(:)[4]%b ! OK now |
| |
| x(1) = y%caf2(2)[4]%b ! OK |
| x(:) = y%caf2(:)[4]%b ! OK now |
| end subroutine six |
| |
| call one() |
| call two() |
| call three() |
| call four() |
| call five() |
| call six() |
| end |