! Copyright 2016-2019 Free Software Foundation, Inc.

! This program is free software; you can redistribute it and/or modify
! it under the terms of the GNU General Public License as published by
! the Free Software Foundation; either version 3 of the License, or
! (at your option) any later version.
!
! This program is distributed in the hope that it will be useful,
! but WITHOUT ANY WARRANTY; without even the implied warranty of
! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
! GNU General Public License for more details.
!
! You should have received a copy of the GNU General Public License
! along with this program.  If not, see <http://www.gnu.org/licenses/>.

program vla_struct
  type :: one
    integer, allocatable :: ivla (:, :, :)
  end type one
  type :: two
    integer, allocatable :: ivla1 (:, :, :)
    integer, allocatable :: ivla2 (:, :)
  end type two
  type :: three
    integer :: ivar
    integer, allocatable :: ivla (:)
  end type three
  type :: four
    integer, allocatable :: ivla (:)
    integer :: ivar
  end type four
  type :: five
    type(one) :: tone
  end type five

  type(one), target        :: onev
  type(two)                :: twov
  type(three)              :: threev
  type(four)               :: fourv
  type(five)               :: fivev
  type(five)               :: fivearr (2)
  type(five), allocatable  :: fivedynarr (:)
  logical                  :: l
  integer                  :: i, j

  allocate (onev%ivla (11,22,33))         ! before-allocated
  l = allocated(onev%ivla)

  onev%ivla(:, :, :) = 1
  onev%ivla(1, 2, 3) = 123
  onev%ivla(3, 2, 1) = 321

  allocate (twov%ivla1 (5,12,99))         ! onev-filled
  l = allocated(twov%ivla1)
  allocate (twov%ivla2 (9,12))
  l = allocated(twov%ivla2)

  twov%ivla1(:, :, :) = 1
  twov%ivla1(1, 2, 3) = 123
  twov%ivla1(3, 2, 1) = 321

  twov%ivla2(:, :) = 1
  twov%ivla2(1, 2) = 12
  twov%ivla2(2, 1) = 21

  threev%ivar = 3                      ! twov-filled
  allocate (threev%ivla (20))
  l = allocated(threev%ivla)

  threev%ivla(:) = 1
  threev%ivla(5) = 42
  threev%ivla(14) = 24

  allocate (fourv%ivla (10))             ! threev-filled
  l = allocated(fourv%ivla)

  fourv%ivar = 3
  fourv%ivla(:) = 1
  fourv%ivla(2) = 2
  fourv%ivla(7) = 7

  allocate (fivev%tone%ivla (10, 10, 10))         ! fourv-filled
  l = allocated(fivev%tone%ivla)
  fivev%tone%ivla(:, :, :) = 1
  fivev%tone%ivla(1, 2, 3) = 123
  fivev%tone%ivla(3, 2, 1) = 321

  allocate (fivearr(1)%tone%ivla (2, 4, 6))        ! fivev-filled
  allocate (fivearr(2)%tone%ivla (12, 14, 16))
  fivearr(1)%tone%ivla(:, :, :) = 1
  fivearr(1)%tone%ivla(2, 2, 3) = 223
  fivearr(2)%tone%ivla(:, :, :) = 2
  fivearr(2)%tone%ivla(6, 7, 8) = 678

  allocate (fivedynarr(2))                         ! fivearr-filled
  allocate (fivedynarr(1)%tone%ivla (2, 4, 6))
  allocate (fivedynarr(2)%tone%ivla (12, 14, 16))
  fivedynarr(1)%tone%ivla(:, :, :) = 1
  fivedynarr(1)%tone%ivla(2, 2, 3) = 223
  fivedynarr(2)%tone%ivla(:, :, :) = 2
  fivedynarr(2)%tone%ivla(6, 7, 8) = 678

  l = allocated(fivedynarr)                        ! fivedynarr-filled
end program vla_struct
