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.
5!
6! Contributed by Keith Refson  <krefson@googlemail.com>
7! and Douglas Foulds  <mixnmaster@gmail.com>
8!
9! This is PR48360
10
11module m
12  type mm
13     real, dimension(3,3) :: h0
14  end type mm
15end module m
16
17module gf33
18
19  real, allocatable, save, dimension(:,:) :: hmat
20
21contains
22  subroutine assignit
23
24    use m
25    implicit none
26
27    type(mm) :: mmv
28
29    hmat = mmv%h0
30  end subroutine assignit
31end module gf33
32
33! This is PR48456
34
35module custom_type
36
37integer, parameter :: dp = kind(0.d0)
38
39type :: my_type_sub
40    real(dp), dimension(5) :: some_vector
41end type my_type_sub
42
43type :: my_type
44  type(my_type_sub) :: some_element
45end type my_type
46
47end module custom_type
48
49module custom_interfaces
50
51interface
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
57end interface
58
59end module custom_interfaces
60
61module store_data_test
62
63use custom_type
64
65save
66type(my_type), dimension(:), allocatable :: some_type_to_save
67
68end module store_data_test
69
70program test
71
72use store_data_test
73
74integer :: vec_size
75
76vec_size = 2
77
78call store_data_subroutine(vec_size)
79call print_after_transfer()
80
81end program test
82
83subroutine store_data_subroutine(vec_size)
84
85use custom_type
86use store_data_test
87
88implicit none
89
90integer, intent(in) :: vec_size
91integer :: k
92
93allocate(some_type_to_save(vec_size))
94
95do k = 1,vec_size
96
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
102
103end do
104
105end subroutine store_data_subroutine
106
107subroutine print_after_transfer()
108
109use custom_type
110use store_data_test
111
112implicit none
113
114real(dp), dimension(:), allocatable :: C_vec
115integer :: k
116
117allocate(C_vec(5))
118
119do k = 1,size(some_type_to_save)
120
121  C_vec = some_type_to_save(k)%some_element%some_vector
122  print *, "C_vec", C_vec
123
124end do
125
126end subroutine print_after_transfer
127