| ! { dg-do run } |
| ! |
| ! Check fix for correctly deep copying allocatable components. |
| ! PR fortran/59678 |
| ! Contributed by Andre Vehreschild <vehre@gmx.de> |
| ! |
| program alloc_comp_copy_test |
| |
| type InnerT |
| integer :: ii |
| integer, allocatable :: ai |
| integer, allocatable :: v(:) |
| end type InnerT |
| |
| type T |
| integer :: i |
| integer, allocatable :: a_i |
| type(InnerT), allocatable :: it |
| type(InnerT), allocatable :: vec(:) |
| end type T |
| |
| type(T) :: o1, o2 |
| class(T), allocatable :: o3, o4 |
| o1%i = 42 |
| |
| call copyO(o1, o2) |
| if (o2%i /= 42) STOP 1 |
| if (allocated(o2%a_i)) STOP 2 |
| if (allocated(o2%it)) STOP 3 |
| if (allocated(o2%vec)) STOP 4 |
| |
| allocate (o1%a_i, source=2) |
| call copyO(o1, o2) |
| if (o2%i /= 42) STOP 5 |
| if (.not. allocated(o2%a_i)) STOP 6 |
| if (o2%a_i /= 2) STOP 7 |
| if (allocated(o2%it)) STOP 8 |
| if (allocated(o2%vec)) STOP 9 |
| |
| allocate (o1%it) |
| o1%it%ii = 3 |
| call copyO(o1, o2) |
| if (o2%i /= 42) STOP 10 |
| if (.not. allocated(o2%a_i)) STOP 11 |
| if (o2%a_i /= 2) STOP 12 |
| if (.not. allocated(o2%it)) STOP 13 |
| if (o2%it%ii /= 3) STOP 14 |
| if (allocated(o2%it%ai)) STOP 15 |
| if (allocated(o2%it%v)) STOP 16 |
| if (allocated(o2%vec)) STOP 17 |
| |
| allocate (o1%it%ai) |
| o1%it%ai = 4 |
| call copyO(o1, o2) |
| if (o2%i /= 42) STOP 18 |
| if (.not. allocated(o2%a_i)) STOP 19 |
| if (o2%a_i /= 2) STOP 20 |
| if (.not. allocated(o2%it)) STOP 21 |
| if (o2%it%ii /= 3) STOP 22 |
| if (.not. allocated(o2%it%ai)) STOP 23 |
| if (o2%it%ai /= 4) STOP 24 |
| if (allocated(o2%it%v)) STOP 25 |
| if (allocated(o2%vec)) STOP 26 |
| |
| allocate (o1%it%v(3), source= 5) |
| call copyO(o1, o2) |
| if (o2%i /= 42) STOP 27 |
| if (.not. allocated(o2%a_i)) STOP 28 |
| if (o2%a_i /= 2) STOP 29 |
| if (.not. allocated(o2%it)) STOP 30 |
| if (o2%it%ii /= 3) STOP 31 |
| if (.not. allocated(o2%it%ai)) STOP 32 |
| if (o2%it%ai /= 4) STOP 33 |
| if (.not. allocated(o2%it%v)) STOP 34 |
| if (any (o2%it%v /= 5) .or. size (o2%it%v) /= 3) STOP 35 |
| if (allocated(o2%vec)) STOP 36 |
| |
| allocate (o1%vec(2)) |
| o1%vec(:)%ii = 6 |
| call copyO(o1, o2) |
| if (o2%i /= 42) STOP 37 |
| if (.not. allocated(o2%a_i)) STOP 38 |
| if (o2%a_i /= 2) STOP 39 |
| if (.not. allocated(o2%it)) STOP 40 |
| if (o2%it%ii /= 3) STOP 41 |
| if (.not. allocated(o2%it%ai)) STOP 42 |
| if (o2%it%ai /= 4) STOP 43 |
| if (.not. allocated(o2%it%v)) STOP 44 |
| if (size (o2%it%v) /= 3) STOP 45 |
| if (any (o2%it%v /= 5)) STOP 46 |
| if (.not. allocated(o2%vec)) STOP 47 |
| if (size(o2%vec) /= 2) STOP 48 |
| if (any(o2%vec(:)%ii /= 6)) STOP 49 |
| if (allocated(o2%vec(1)%ai) .or. allocated(o2%vec(2)%ai)) STOP 50 |
| if (allocated(o2%vec(1)%v) .or. allocated(o2%vec(2)%v)) STOP 51 |
| |
| allocate (o1%vec(2)%ai) |
| o1%vec(2)%ai = 7 |
| call copyO(o1, o2) |
| if (o2%i /= 42) STOP 52 |
| if (.not. allocated(o2%a_i)) STOP 53 |
| if (o2%a_i /= 2) STOP 54 |
| if (.not. allocated(o2%it)) STOP 55 |
| if (o2%it%ii /= 3) STOP 56 |
| if (.not. allocated(o2%it%ai)) STOP 57 |
| if (o2%it%ai /= 4) STOP 58 |
| if (.not. allocated(o2%it%v)) STOP 59 |
| if (size (o2%it%v) /= 3) STOP 60 |
| if (any (o2%it%v /= 5)) STOP 61 |
| if (.not. allocated(o2%vec)) STOP 62 |
| if (size(o2%vec) /= 2) STOP 63 |
| if (any(o2%vec(:)%ii /= 6)) STOP 64 |
| if (allocated(o2%vec(1)%ai)) STOP 65 |
| if (.not. allocated(o2%vec(2)%ai)) STOP 66 |
| if (o2%vec(2)%ai /= 7) STOP 67 |
| if (allocated(o2%vec(1)%v) .or. allocated(o2%vec(2)%v)) STOP 68 |
| |
| allocate (o1%vec(1)%v(3)) |
| o1%vec(1)%v = [8, 9, 10] |
| call copyO(o1, o2) |
| if (o2%i /= 42) STOP 69 |
| if (.not. allocated(o2%a_i)) STOP 70 |
| if (o2%a_i /= 2) STOP 71 |
| if (.not. allocated(o2%it)) STOP 72 |
| if (o2%it%ii /= 3) STOP 73 |
| if (.not. allocated(o2%it%ai)) STOP 74 |
| if (o2%it%ai /= 4) STOP 75 |
| if (.not. allocated(o2%it%v)) STOP 76 |
| if (size (o2%it%v) /= 3) STOP 77 |
| if (any (o2%it%v /= 5)) STOP 78 |
| if (.not. allocated(o2%vec)) STOP 79 |
| if (size(o2%vec) /= 2) STOP 80 |
| if (any(o2%vec(:)%ii /= 6)) STOP 81 |
| if (allocated(o2%vec(1)%ai)) STOP 82 |
| if (.not. allocated(o2%vec(2)%ai)) STOP 83 |
| if (o2%vec(2)%ai /= 7) STOP 84 |
| if (.not. allocated(o2%vec(1)%v)) STOP 85 |
| if (any (o2%vec(1)%v /= [8,9,10])) STOP 86 |
| if (allocated(o2%vec(2)%v)) STOP 87 |
| |
| ! Now all the above for class objects. |
| allocate (o3, o4) |
| o3%i = 42 |
| |
| call copyO(o3, o4) |
| if (o4%i /= 42) STOP 88 |
| if (allocated(o4%a_i)) STOP 89 |
| if (allocated(o4%it)) STOP 90 |
| if (allocated(o4%vec)) STOP 91 |
| |
| allocate (o3%a_i, source=2) |
| call copyO(o3, o4) |
| if (o4%i /= 42) STOP 92 |
| if (.not. allocated(o4%a_i)) STOP 93 |
| if (o4%a_i /= 2) STOP 94 |
| if (allocated(o4%it)) STOP 95 |
| if (allocated(o4%vec)) STOP 96 |
| |
| allocate (o3%it) |
| o3%it%ii = 3 |
| call copyO(o3, o4) |
| if (o4%i /= 42) STOP 97 |
| if (.not. allocated(o4%a_i)) STOP 98 |
| if (o4%a_i /= 2) STOP 99 |
| if (.not. allocated(o4%it)) STOP 100 |
| if (o4%it%ii /= 3) STOP 101 |
| if (allocated(o4%it%ai)) STOP 102 |
| if (allocated(o4%it%v)) STOP 103 |
| if (allocated(o4%vec)) STOP 104 |
| |
| allocate (o3%it%ai) |
| o3%it%ai = 4 |
| call copyO(o3, o4) |
| if (o4%i /= 42) STOP 105 |
| if (.not. allocated(o4%a_i)) STOP 106 |
| if (o4%a_i /= 2) STOP 107 |
| if (.not. allocated(o4%it)) STOP 108 |
| if (o4%it%ii /= 3) STOP 109 |
| if (.not. allocated(o4%it%ai)) STOP 110 |
| if (o4%it%ai /= 4) STOP 111 |
| if (allocated(o4%it%v)) STOP 112 |
| if (allocated(o4%vec)) STOP 113 |
| |
| allocate (o3%it%v(3), source= 5) |
| call copyO(o3, o4) |
| if (o4%i /= 42) STOP 114 |
| if (.not. allocated(o4%a_i)) STOP 115 |
| if (o4%a_i /= 2) STOP 116 |
| if (.not. allocated(o4%it)) STOP 117 |
| if (o4%it%ii /= 3) STOP 118 |
| if (.not. allocated(o4%it%ai)) STOP 119 |
| if (o4%it%ai /= 4) STOP 120 |
| if (.not. allocated(o4%it%v)) STOP 121 |
| if (any (o4%it%v /= 5) .or. size (o4%it%v) /= 3) STOP 122 |
| if (allocated(o4%vec)) STOP 123 |
| |
| allocate (o3%vec(2)) |
| o3%vec(:)%ii = 6 |
| call copyO(o3, o4) |
| if (o4%i /= 42) STOP 124 |
| if (.not. allocated(o4%a_i)) STOP 125 |
| if (o4%a_i /= 2) STOP 126 |
| if (.not. allocated(o4%it)) STOP 127 |
| if (o4%it%ii /= 3) STOP 128 |
| if (.not. allocated(o4%it%ai)) STOP 129 |
| if (o4%it%ai /= 4) STOP 130 |
| if (.not. allocated(o4%it%v)) STOP 131 |
| if (size (o4%it%v) /= 3) STOP 132 |
| if (any (o4%it%v /= 5)) STOP 133 |
| if (.not. allocated(o4%vec)) STOP 134 |
| if (size(o4%vec) /= 2) STOP 135 |
| if (any(o4%vec(:)%ii /= 6)) STOP 136 |
| if (allocated(o4%vec(1)%ai) .or. allocated(o4%vec(2)%ai)) STOP 137 |
| if (allocated(o4%vec(1)%v) .or. allocated(o4%vec(2)%v)) STOP 138 |
| |
| allocate (o3%vec(2)%ai) |
| o3%vec(2)%ai = 7 |
| call copyO(o3, o4) |
| if (o4%i /= 42) STOP 139 |
| if (.not. allocated(o4%a_i)) STOP 140 |
| if (o4%a_i /= 2) STOP 141 |
| if (.not. allocated(o4%it)) STOP 142 |
| if (o4%it%ii /= 3) STOP 143 |
| if (.not. allocated(o4%it%ai)) STOP 144 |
| if (o4%it%ai /= 4) STOP 145 |
| if (.not. allocated(o4%it%v)) STOP 146 |
| if (size (o4%it%v) /= 3) STOP 147 |
| if (any (o4%it%v /= 5)) STOP 148 |
| if (.not. allocated(o4%vec)) STOP 149 |
| if (size(o4%vec) /= 2) STOP 150 |
| if (any(o4%vec(:)%ii /= 6)) STOP 151 |
| if (allocated(o4%vec(1)%ai)) STOP 152 |
| if (.not. allocated(o4%vec(2)%ai)) STOP 153 |
| if (o4%vec(2)%ai /= 7) STOP 154 |
| if (allocated(o4%vec(1)%v) .or. allocated(o4%vec(2)%v)) STOP 155 |
| |
| allocate (o3%vec(1)%v(3)) |
| o3%vec(1)%v = [8, 9, 10] |
| call copyO(o3, o4) |
| if (o4%i /= 42) STOP 156 |
| if (.not. allocated(o4%a_i)) STOP 157 |
| if (o4%a_i /= 2) STOP 158 |
| if (.not. allocated(o4%it)) STOP 159 |
| if (o4%it%ii /= 3) STOP 160 |
| if (.not. allocated(o4%it%ai)) STOP 161 |
| if (o4%it%ai /= 4) STOP 162 |
| if (.not. allocated(o4%it%v)) STOP 163 |
| if (size (o4%it%v) /= 3) STOP 164 |
| if (any (o4%it%v /= 5)) STOP 165 |
| if (.not. allocated(o4%vec)) STOP 166 |
| if (size(o4%vec) /= 2) STOP 167 |
| if (any(o4%vec(:)%ii /= 6)) STOP 168 |
| if (allocated(o4%vec(1)%ai)) STOP 169 |
| if (.not. allocated(o4%vec(2)%ai)) STOP 170 |
| if (o4%vec(2)%ai /= 7) STOP 171 |
| if (.not. allocated(o4%vec(1)%v)) STOP 172 |
| if (any (o4%vec(1)%v /= [8,9,10])) STOP 173 |
| if (allocated(o4%vec(2)%v)) STOP 174 |
| |
| contains |
| |
| subroutine copyO(src, dst) |
| type(T), intent(in) :: src |
| type(T), intent(out) :: dst |
| |
| dst = src |
| end subroutine copyO |
| |
| end program alloc_comp_copy_test |
| |