2018-09-30 Paul Thomas <pault@gcc.gnu.org>
[official-gcc.git] / gcc / testsuite / gfortran.dg / realloc_on_assign_6.f03
blob3c96c73a7438868331291cb04fc9d5dfc76c4c0f
1 ! { dg-do compile }
2 ! Test the fix for PR48456 and PR48360 in which the backend
3 ! declarations for components were not located in the automatic
4 ! reallocation on assignments, thereby causing ICEs.
6 ! Contributed by Keith Refson  <krefson@googlemail.com>
7 ! and Douglas Foulds  <mixnmaster@gmail.com>
9 ! This is PR48360
11 module m
12   type mm
13      real, dimension(3,3) :: h0
14   end type mm
15 end module m
17 module gf33
19   real, allocatable, save, dimension(:,:) :: hmat
20   
21 contains
22   subroutine assignit
23     
24     use m
25     implicit none
26     
27     type(mm) :: mmv
28     
29     hmat = mmv%h0
30   end subroutine assignit
31 end module gf33
33 ! This is PR48456
35 module custom_type
37 integer, parameter :: dp = kind(0.d0)
39 type :: my_type_sub
40     real(dp), dimension(5) :: some_vector
41 end type my_type_sub
43 type :: my_type
44   type(my_type_sub) :: some_element
45 end type my_type
47 end module custom_type
49 module custom_interfaces
51 interface
52   subroutine store_data_subroutine(vec_size)
53   implicit none
54   integer, intent(in) :: vec_size
55   integer :: k
56   end subroutine store_data_subroutine
57 end interface
59 end module custom_interfaces
61 module store_data_test
63 use custom_type
65 save
66 type(my_type), dimension(:), allocatable :: some_type_to_save
68 end module store_data_test
70 program test
72 use store_data_test
74 integer :: vec_size
76 vec_size = 2
78 call store_data_subroutine(vec_size)
79 call print_after_transfer()
81 end program test
83 subroutine store_data_subroutine(vec_size)
85 use custom_type
86 use store_data_test
88 implicit none
90 integer, intent(in) :: vec_size
91 integer :: k
93 allocate(some_type_to_save(vec_size))
95 do k = 1,vec_size
97   some_type_to_save(k)%some_element%some_vector(1) = 1.0_dp
98   some_type_to_save(k)%some_element%some_vector(2) = 2.0_dp
99   some_type_to_save(k)%some_element%some_vector(3) = 3.0_dp
100   some_type_to_save(k)%some_element%some_vector(4) = 4.0_dp
101   some_type_to_save(k)%some_element%some_vector(5) = 5.0_dp
103 end do
105 end subroutine store_data_subroutine
107 subroutine print_after_transfer()
109 use custom_type
110 use store_data_test
112 implicit none
114 real(dp), dimension(:), allocatable :: C_vec
115 integer :: k
117 allocate(C_vec(5))
119 do k = 1,size(some_type_to_save)
121   C_vec = some_type_to_save(k)%some_element%some_vector
122   print *, "C_vec", C_vec
124 end do
126 end subroutine print_after_transfer