| ! { dg-do run } |
| ! |
| ! Tests functionality of recursive allocatable derived types. |
| ! Here the recursive components are arrays, unlike the first three testcases. |
| ! Notice that array components are fiendishly difficult to use :-( |
| ! |
| module m |
| type :: recurses |
| type(recurses), allocatable :: c(:) |
| integer, allocatable :: ia |
| end type |
| end module |
| |
| use m |
| type(recurses), allocatable, target :: a, d(:) |
| type(recurses), pointer :: b1 |
| |
| integer :: total = 0 |
| |
| ! Check chained allocation. |
| allocate(a) |
| a%ia = 1 |
| allocate (a%c(2)) |
| b1 => a%c(1) |
| b1%ia = 2 |
| |
| ! Check move_alloc. |
| allocate (d(2)) |
| d(1)%ia = 3 |
| d(2)%ia = 4 |
| b1 => d(2) |
| allocate (b1%c(1)) |
| b1 => b1%c(1) |
| b1%ia = 5 |
| call move_alloc (d, a%c(2)%c) |
| |
| if (a%ia .ne. 1) STOP 1 |
| if (a%c(1)%ia .ne. 2) STOP 2 |
| if (a%c(2)%c(1)%ia .ne. 3) STOP 3 |
| if (a%c(2)%c(2)%ia .ne. 4) STOP 4 |
| if (a%c(2)%c(2)%c(1)%ia .ne. 5) STOP 5 |
| |
| if (allocated (a)) deallocate (a) |
| if (allocated (d)) deallocate (d) |
| |
| end |