| ! { dg-do run } |
| ! Checks the fixes for PR34681 and PR34704, in which various mixtures |
| ! of default initializer and allocatable array were not being handled |
| ! correctly for derived types with allocatable components. |
| ! |
| ! Contributed by Paolo Giannozzi <p.giannozzi@fisica.uniud.it> |
| ! |
| program boh |
| integer :: c1, c2, c3, c4, c5 |
| ! |
| call mah (0, c1) ! These calls deal with PR34681 |
| call mah (1, c2) |
| call mah (2, c3) |
| ! |
| if (c1 /= c2) STOP 1 |
| if (c1 /= c3) STOP 1 |
| ! |
| call mah0 (c4) ! These calls deal with PR34704 |
| call mah1 (c5) |
| ! |
| if (c4 /= c5) STOP 2 |
| ! |
| end program boh |
| ! |
| subroutine mah (i, c) |
| ! |
| integer, intent(in) :: i |
| integer, intent(OUT) :: c |
| ! |
| type mix_type |
| real(8), allocatable :: a(:) |
| complex(8), allocatable :: b(:) |
| end type mix_type |
| type(mix_type), allocatable, save :: t(:) |
| integer :: j, n=1024 |
| ! |
| if (i==0) then |
| allocate (t(1)) |
| allocate (t(1)%a(n)) |
| allocate (t(1)%b(n)) |
| do j=1,n |
| t(1)%a(j) = j |
| t(1)%b(j) = n-j |
| end do |
| end if |
| c = sum( t(1)%a(:) ) + sum( t(1)%b(:) ) |
| if ( i==2) then |
| deallocate (t(1)%b) |
| deallocate (t(1)%a) |
| deallocate (t) |
| end if |
| end subroutine mah |
| |
| subroutine mah0 (c) |
| ! |
| integer, intent(OUT) :: c |
| type mix_type |
| real(8), allocatable :: a(:) |
| integer :: n=1023 |
| end type mix_type |
| type(mix_type) :: t |
| ! |
| allocate(t%a(1)) |
| t%a=3.1415926 |
| c = t%n |
| deallocate(t%a) |
| ! |
| end subroutine mah0 |
| ! |
| subroutine mah1 (c) |
| ! |
| integer, intent(OUT) :: c |
| type mix_type |
| real(8), allocatable :: a(:) |
| integer :: n=1023 |
| end type mix_type |
| type(mix_type), save :: t |
| ! |
| allocate(t%a(1)) |
| t%a=3.1415926 |
| c = t%n |
| deallocate(t%a) |
| ! |
| end subroutine mah1 |