1! Test default initialization of global variables (static init) 2! RUN: bbc %s -o - | FileCheck %s 3 4module tinit 5 real, target :: ziel(100) 6 7 type tno_init 8 integer :: k 9 end type 10 11 type t0 12 integer :: k = 66 13 end type 14 15 ! Test type that combines all kinds of components with and without 16 ! default initialization. 17 type t1 18 ! Simple type component with default init 19 integer :: i = 42 20 ! Simple type component without default init 21 integer :: j 22 23 ! Pointer component with a default initial target 24 real, pointer :: x(:) => ziel 25 ! Pointer component with no init 26 real, pointer :: y(:) 27 ! Pointer component with null init 28 real, pointer :: z(:) => NULL() 29 30 ! Character component with init 31 character(10) c1 = "hello" 32 ! Character component without init 33 character(10) c2 34 35 ! Component with a derived type that has default init 36 type(t0) :: somet0 37 ! Component with a derived type that has no default init. 38 type(tno_init) :: sometno_init 39 ! Component whose type default init is overridden by 40 ! default init for the component. 41 type(t0) :: somet0_2 = t0(33) 42 ! Array component with a derived type that has default init 43 type(t0) :: somet0_array 44 end type 45 46 ! Test type that extends type with default init. 47 type, extends(t0) :: textendst0 48 integer :: l 49 end type 50 51 ! Test type with default init in equivalences 52 type tseq 53 sequence 54 integer :: i = 2 55 integer :: j = 3 56 end type 57 58 ! Test scalar with default init 59 type(t0) :: at0 60! CHECK-LABEL: fir.global @_QMtinitEat0 : !fir.type<_QMtinitTt0{k:i32}> { 61 ! CHECK: %[[VAL_0:.*]] = arith.constant 66 : i32 62 ! CHECK: %[[VAL_1:.*]] = fir.undefined !fir.type<_QMtinitTt0{k:i32}> 63 ! CHECK: %[[VAL_2:.*]] = fir.insert_value %[[VAL_1]], %[[VAL_0]], ["k", !fir.type<_QMtinitTt0{k:i32}>] : (!fir.type<_QMtinitTt0{k:i32}>, i32) -> !fir.type<_QMtinitTt0{k:i32}> 64 ! CHECK: fir.has_value %[[VAL_2]] : !fir.type<_QMtinitTt0{k:i32}> 65 66 ! Test array with default init 67 type(t0) :: bt0(100) 68! CHECK-LABEL: @_QMtinitEbt0 : !fir.array<100x!fir.type<_QMtinitTt0{k:i32}>> { 69 ! CHECK: %[[VAL_3:.*]] = arith.constant 66 : i32 70 ! CHECK: %[[VAL_4:.*]] = fir.undefined !fir.type<_QMtinitTt0{k:i32}> 71 ! CHECK: %[[VAL_5:.*]] = fir.insert_value %[[VAL_4]], %[[VAL_3]], ["k", !fir.type<_QMtinitTt0{k:i32}>] : (!fir.type<_QMtinitTt0{k:i32}>, i32) -> !fir.type<_QMtinitTt0{k:i32}> 72 ! CHECK: %[[VAL_6:.*]] = fir.undefined !fir.array<100x!fir.type<_QMtinitTt0{k:i32}>> 73 ! CHECK: %[[VAL_7:.*]] = fir.insert_on_range %[[VAL_6]], %[[VAL_5]] from (0) to (99) : (!fir.array<100x!fir.type<_QMtinitTt0{k:i32}>>, !fir.type<_QMtinitTt0{k:i32}>) -> !fir.array<100x!fir.type<_QMtinitTt0{k:i32}>> 74 ! CHECK: fir.has_value %[[VAL_7]] : !fir.array<100x!fir.type<_QMtinitTt0{k:i32}>> 75 76 ! Test default init overridden by explicit init 77 type(t0) :: ct0 = t0(42) 78! CHECK-LABEL: fir.global @_QMtinitEct0 : !fir.type<_QMtinitTt0{k:i32}> { 79 ! CHECK: %[[VAL_8:.*]] = arith.constant 42 : i32 80 ! CHECK: %[[VAL_9:.*]] = fir.undefined !fir.type<_QMtinitTt0{k:i32}> 81 ! CHECK: %[[VAL_10:.*]] = fir.insert_value %[[VAL_9]], %[[VAL_8]], ["k", !fir.type<_QMtinitTt0{k:i32}>] : (!fir.type<_QMtinitTt0{k:i32}>, i32) -> !fir.type<_QMtinitTt0{k:i32}> 82 ! CHECK: fir.has_value %[[VAL_10]] : !fir.type<_QMtinitTt0{k:i32}> 83 84 ! Test a non trivial derived type mixing all sorts of default initialization 85 type(t1) :: dt1 86! CHECK-LABEL: @_QMtinitEdt1 : !fir.type<_QMtinitTt1{{.*}}> { 87 ! CHECK-DAG: %[[VAL_11:.*]] = arith.constant 42 : i32 88 ! CHECK-DAG: %[[VAL_12:.*]] = arith.constant 100 : index 89 ! CHECK-DAG: %[[VAL_13:.*]] = arith.constant 0 : index 90 ! CHECK-DAG: %[[VAL_14:.*]] = arith.constant 33 : i32 91 ! CHECK-DAG: %[[VAL_15:.*]] = arith.constant 66 : i32 92 ! CHECK: %[[VAL_16:.*]] = fir.undefined !fir.type<_QMtinitTt1{{.*}}> 93 ! CHECK: %[[VAL_17:.*]] = fir.insert_value %[[VAL_16]], %[[VAL_11]], ["i", !fir.type<_QMtinitTt1{{.*}}>] : (!fir.type<_QMtinitTt1{{.*}}>, i32) -> !fir.type<_QMtinitTt1{{.*}}> 94 ! CHECK: %[[VAL_18:.*]] = fir.undefined i32 95 ! CHECK: %[[VAL_19:.*]] = fir.insert_value %[[VAL_17]], %[[VAL_18]], ["j", !fir.type<_QMtinitTt1{{.*}}>] : (!fir.type<_QMtinitTt1{{.*}}>, i32) -> !fir.type<_QMtinitTt1{{.*}}> 96 ! CHECK: %[[VAL_20:.*]] = fir.address_of(@_QMtinitEziel) : !fir.ref<!fir.array<100xf32>> 97 ! CHECK: %[[VAL_21:.*]] = fir.shape %[[VAL_12]] : (index) -> !fir.shape<1> 98 ! CHECK: %[[VAL_22:.*]] = fir.embox %[[VAL_20]](%[[VAL_21]]) : (!fir.ref<!fir.array<100xf32>>, !fir.shape<1>) -> !fir.box<!fir.ptr<!fir.array<?xf32>>> 99 ! CHECK: %[[VAL_23:.*]] = fir.insert_value %[[VAL_19]], %[[VAL_22]], ["x", !fir.type<_QMtinitTt1{{.*}}>] : (!fir.type<_QMtinitTt1{{.*}}>, !fir.box<!fir.ptr<!fir.array<?xf32>>>) -> !fir.type<_QMtinitTt1{{.*}}> 100 ! CHECK: %[[VAL_24:.*]] = fir.zero_bits !fir.ptr<!fir.array<?xf32>> 101 ! CHECK: %[[VAL_25:.*]] = fir.shape %[[VAL_13]] : (index) -> !fir.shape<1> 102 ! CHECK: %[[VAL_26:.*]] = fir.embox %[[VAL_24]](%[[VAL_25]]) : (!fir.ptr<!fir.array<?xf32>>, !fir.shape<1>) -> !fir.box<!fir.ptr<!fir.array<?xf32>>> 103 ! CHECK: %[[VAL_27:.*]] = fir.insert_value %[[VAL_23]], %[[VAL_26]], ["y", !fir.type<_QMtinitTt1{{.*}}>] : (!fir.type<_QMtinitTt1{{.*}}>, !fir.box<!fir.ptr<!fir.array<?xf32>>>) -> !fir.type<_QMtinitTt1{{.*}}> 104 ! CHECK: %[[VAL_28:.*]] = fir.insert_value %[[VAL_27]], %[[VAL_26]], ["z", !fir.type<_QMtinitTt1{{.*}}>] : (!fir.type<_QMtinitTt1{{.*}}>, !fir.box<!fir.ptr<!fir.array<?xf32>>>) -> !fir.type<_QMtinitTt1{{.*}}> 105 ! CHECK: %[[VAL_29:.*]] = fir.string_lit "hello "(10) : !fir.char<1,10> 106 ! CHECK: %[[VAL_30:.*]] = fir.insert_value %[[VAL_28]], %[[VAL_29]], ["c1", !fir.type<_QMtinitTt1{{.*}}>] : (!fir.type<_QMtinitTt1{{.*}}>, !fir.char<1,10>) -> !fir.type<_QMtinitTt1{{.*}}> 107 ! CHECK: %[[VAL_31:.*]] = fir.undefined !fir.char<1,10> 108 ! CHECK: %[[VAL_32:.*]] = fir.insert_value %[[VAL_30]], %[[VAL_31]], ["c2", !fir.type<_QMtinitTt1{{.*}}>] : (!fir.type<_QMtinitTt1{{.*}}>, !fir.char<1,10>) -> !fir.type<_QMtinitTt1{{.*}}> 109 ! CHECK: %[[VAL_33:.*]] = fir.undefined !fir.type<_QMtinitTt0{k:i32}> 110 ! CHECK: %[[VAL_34:.*]] = fir.insert_value %[[VAL_33]], %[[VAL_15]], ["k", !fir.type<_QMtinitTt0{k:i32}>] : (!fir.type<_QMtinitTt0{k:i32}>, i32) -> !fir.type<_QMtinitTt0{k:i32}> 111 ! CHECK: %[[VAL_35:.*]] = fir.insert_value %[[VAL_32]], %[[VAL_34]], ["somet0", !fir.type<_QMtinitTt1{{.*}}>] : (!fir.type<_QMtinitTt1{{.*}}>, !fir.type<_QMtinitTt0{k:i32}>) -> !fir.type<_QMtinitTt1{{.*}}> 112 ! CHECK: %[[VAL_36:.*]] = fir.undefined !fir.type<_QMtinitTtno_init{k:i32}> 113 ! CHECK: %[[VAL_37:.*]] = fir.insert_value %[[VAL_35]], %[[VAL_36]], ["sometno_init", !fir.type<_QMtinitTt1{{.*}}>] : (!fir.type<_QMtinitTt1{{.*}}>, !fir.type<_QMtinitTtno_init{k:i32}>) -> !fir.type<_QMtinitTt1{{.*}}> 114 ! CHECK: %[[VAL_38:.*]] = fir.insert_value %[[VAL_33]], %[[VAL_14]], ["k", !fir.type<_QMtinitTt0{k:i32}>] : (!fir.type<_QMtinitTt0{k:i32}>, i32) -> !fir.type<_QMtinitTt0{k:i32}> 115 ! CHECK: %[[VAL_39:.*]] = fir.insert_value %[[VAL_37]], %[[VAL_38]], ["somet0_2", !fir.type<_QMtinitTt1{{.*}}>] : (!fir.type<_QMtinitTt1{{.*}}>, !fir.type<_QMtinitTt0{k:i32}>) -> !fir.type<_QMtinitTt1{{.*}}> 116 ! CHECK: %[[VAL_40:.*]] = fir.insert_value %[[VAL_39]], %[[VAL_34]], ["somet0_array", !fir.type<_QMtinitTt1{{.*}}>] : (!fir.type<_QMtinitTt1{{.*}}>, !fir.type<_QMtinitTt0{k:i32}>) -> !fir.type<_QMtinitTt1{{.*}}> 117 ! CHECK: fir.has_value %[[VAL_40]] : !fir.type<_QMtinitTt1{{.*}}> 118 119 ! Test a type extending other type with a default init 120 type(textendst0) :: etextendst0 121! CHECK-LABEL: @_QMtinitEetextendst0 : !fir.type<_QMtinitTtextendst0{k:i32,l:i32}> { 122 ! CHECK: %[[VAL_42:.*]] = arith.constant 66 : i32 123 ! CHECK: %[[VAL_43:.*]] = fir.undefined !fir.type<_QMtinitTtextendst0{k:i32,l:i32}> 124 ! CHECK: %[[VAL_44:.*]] = fir.insert_value %[[VAL_43]], %[[VAL_42]], ["k", !fir.type<_QMtinitTtextendst0{k:i32,l:i32}>] : (!fir.type<_QMtinitTtextendst0{k:i32,l:i32}>, i32) -> !fir.type<_QMtinitTtextendst0{k:i32,l:i32}> 125 ! CHECK: %[[VAL_45:.*]] = fir.undefined i32 126 ! CHECK: %[[VAL_46:.*]] = fir.insert_value %[[VAL_44]], %[[VAL_45]], ["l", !fir.type<_QMtinitTtextendst0{k:i32,l:i32}>] : (!fir.type<_QMtinitTtextendst0{k:i32,l:i32}>, i32) -> !fir.type<_QMtinitTtextendst0{k:i32,l:i32}> 127 ! CHECK: fir.has_value %[[VAL_46]] : !fir.type<_QMtinitTtextendst0{k:i32,l:i32}> 128end module 129 130 131! Test that default initialization is also applied to saved variables 132subroutine saved() 133 use tinit 134 type(t0), save :: savedt0 135! CHECK-LABEL: fir.global internal @_QFsavedEsavedt0 : !fir.type<_QMtinitTt0{k:i32}> { 136 ! CHECK: %[[VAL_47:.*]] = arith.constant 66 : i32 137 ! CHECK: %[[VAL_48:.*]] = fir.undefined !fir.type<_QMtinitTt0{k:i32}> 138 ! CHECK: %[[VAL_49:.*]] = fir.insert_value %[[VAL_48]], %[[VAL_47]], ["k", !fir.type<_QMtinitTt0{k:i32}>] : (!fir.type<_QMtinitTt0{k:i32}>, i32) -> !fir.type<_QMtinitTt0{k:i32}> 139 ! CHECK: fir.has_value %[[VAL_49]] : !fir.type<_QMtinitTt0{k:i32}> 140end subroutine 141 142! Test default initialization in equivalences 143subroutine eqv() 144 use tinit 145 type(tseq), save :: somet 146 integer :: i(2) 147 equivalence (somet, i) 148! CHECK-LABEL: fir.global internal @_QFeqvEi : !fir.array<2xi32> { 149 ! CHECK-DAG: %[[VAL_50:.*]] = arith.constant 2 : i32 150 ! CHECK-DAG: %[[VAL_51:.*]] = arith.constant 3 : i32 151 ! CHECK: %[[VAL_52:.*]] = fir.undefined !fir.array<2xi32> 152 ! CHECK: %[[VAL_53:.*]] = fir.insert_value %[[VAL_52]], %[[VAL_50]], [0 : index] : (!fir.array<2xi32>, i32) -> !fir.array<2xi32> 153 ! CHECK: %[[VAL_54:.*]] = fir.insert_value %[[VAL_53]], %[[VAL_51]], [1 : index] : (!fir.array<2xi32>, i32) -> !fir.array<2xi32> 154 ! CHECK: fir.has_value %[[VAL_54]] : !fir.array<2xi32> 155end subroutine 156 157subroutine eqv_explicit_init() 158 use tinit 159 type(tseq), save :: somet 160 integer :: i(2) = [4, 5] 161 equivalence (somet, i) 162! CHECK-LABEL: fir.global internal @_QFeqv_explicit_initEi : !fir.array<2xi32> { 163 ! CHECK-DAG: %[[VAL_57:.*]] = arith.constant 4 : i32 164 ! CHECK-DAG: %[[VAL_58:.*]] = arith.constant 5 : i32 165 ! CHECK: %[[VAL_59:.*]] = fir.undefined !fir.array<2xi32> 166 ! CHECK: %[[VAL_60:.*]] = fir.insert_value %[[VAL_59]], %[[VAL_57]], [0 : index] : (!fir.array<2xi32>, i32) -> !fir.array<2xi32> 167 ! CHECK: %[[VAL_61:.*]] = fir.insert_value %[[VAL_60]], %[[VAL_58]], [1 : index] : (!fir.array<2xi32>, i32) -> !fir.array<2xi32> 168 ! CHECK: fir.has_value %[[VAL_61]] : !fir.array<2xi32> 169end subroutine 170 171subroutine eqv_same_default_init() 172 use tinit 173 type(tseq), save :: somet1(2), somet2 174 equivalence (somet1(1), somet2) 175! CHECK-LABEL: fir.global internal @_QFeqv_same_default_initEsomet1 : !fir.array<2xi64> { 176 ! CHECK: %[[VAL_62:.*]] = arith.constant 12884901890 : i64 177 ! CHECK: %[[VAL_63:.*]] = fir.undefined !fir.array<2xi64> 178 ! CHECK: %[[VAL_64:.*]] = fir.insert_on_range %[[VAL_63]], %[[VAL_62]] from (0) to (1) : (!fir.array<2xi64>, i64) -> !fir.array<2xi64> 179 ! CHECK: fir.has_value %[[VAL_64]] : !fir.array<2xi64> 180end subroutine 181 182subroutine eqv_full_overlaps_with_explicit_init() 183 use tinit 184 type(tseq), save :: somet 185 integer, save :: link(4) 186 integer :: i(2) = [5, 6] 187 integer :: j(2) = [7, 8] 188 ! Equivalence: somet fully covered by explicit init. 189 ! i(1)=5 | i(2)=6 | - | - 190 ! - | somet%i | somet%j | 191 ! - | - | j(1)=7 | j(2)=8 192 equivalence (i, link(1)) 193 equivalence (somet, link(2)) 194 equivalence (j, link(3)) 195! CHECK-LABEL: fir.global internal @_QFeqv_full_overlaps_with_explicit_initEi : !fir.array<4xi32> { 196 ! CHECK-DAG: %[[VAL_73:.*]] = arith.constant 5 : i32 197 ! CHECK-DAG: %[[VAL_74:.*]] = arith.constant 6 : i32 198 ! CHECK-DAG: %[[VAL_75:.*]] = arith.constant 7 : i32 199 ! CHECK-DAG: %[[VAL_76:.*]] = arith.constant 8 : i32 200 ! CHECK-DAG: %[[VAL_77:.*]] = fir.undefined !fir.array<4xi32> 201 ! CHECK-DAG: %[[VAL_78:.*]] = fir.insert_value %[[VAL_77]], %[[VAL_73]], [0 : index] : (!fir.array<4xi32>, i32) -> !fir.array<4xi32> 202 ! CHECK-DAG: %[[VAL_79:.*]] = fir.insert_value %[[VAL_78]], %[[VAL_74]], [1 : index] : (!fir.array<4xi32>, i32) -> !fir.array<4xi32> 203 ! CHECK-DAG: %[[VAL_80:.*]] = fir.insert_value %[[VAL_79]], %[[VAL_75]], [2 : index] : (!fir.array<4xi32>, i32) -> !fir.array<4xi32> 204 ! CHECK-DAG: %[[VAL_81:.*]] = fir.insert_value %[[VAL_80]], %[[VAL_76]], [3 : index] : (!fir.array<4xi32>, i32) -> !fir.array<4xi32> 205 ! CHECK-DAG: fir.has_value %[[VAL_81]] : !fir.array<4xi32> 206end subroutine 207 208subroutine eqv_partial_overlaps_with_explicit_init() 209 use tinit 210 type(tseq), save :: somet 211 integer, save :: link(4) 212 integer :: i(2) = [5, 6] 213 integer :: j = 7 214 ! `somet` is only partially covered by explicit init, somet%j default 215 ! init value should be used in the equiv storage init to match nvfortran, 216 ! ifort, and nagfor behavior (gfortran refuses this code). 19.5.3.4 point 217 ! 10 specifies that explicit initialization overrides default initialization. 218 ! i(1)=5 | i(2)=6 | - | - 219 ! - | somet%i | somet%j | 220 ! - | - | - | j=7 221 equivalence (i, link(1)) 222 equivalence (somet, link(2)) 223 equivalence (j, link(4)) 224! CHECK-LABEL: fir.global internal @_QFeqv_partial_overlaps_with_explicit_initEi : !fir.array<4xi32> 225 ! CHECK-DAG: %[[VAL_82:.*]] = arith.constant 5 : i32 226 ! CHECK-DAG: %[[VAL_83:.*]] = arith.constant 6 : i32 227 ! CHECK-DAG: %[[VAL_84:.*]] = arith.constant 3 : i32 228 ! CHECK-DAG: %[[VAL_85:.*]] = arith.constant 7 : i32 229 ! CHECK: %[[VAL_86:.*]] = fir.undefined !fir.array<4xi32> 230 ! CHECK: %[[VAL_87:.*]] = fir.insert_value %[[VAL_86]], %[[VAL_82]], [0 : index] : (!fir.array<4xi32>, i32) -> !fir.array<4xi32> 231 ! CHECK: %[[VAL_88:.*]] = fir.insert_value %[[VAL_87]], %[[VAL_83]], [1 : index] : (!fir.array<4xi32>, i32) -> !fir.array<4xi32> 232 ! CHECK: %[[VAL_89:.*]] = fir.insert_value %[[VAL_88]], %[[VAL_84]], [2 : index] : (!fir.array<4xi32>, i32) -> !fir.array<4xi32> 233 ! CHECK: %[[VAL_90:.*]] = fir.insert_value %[[VAL_89]], %[[VAL_85]], [3 : index] : (!fir.array<4xi32>, i32) -> !fir.array<4xi32> 234 ! CHECK: fir.has_value %[[VAL_90]] : !fir.array<4xi32> 235end subroutine 236