466 lines · plain
1! Test lowering of OPTIONAL VALUE dummy argument on caller side.2! RUN: bbc -emit-fir -hlfir=false %s -o - | FileCheck %s3 4! A copy must be made if the actual is a variable (and no copy-out), but care5! has to be take if the actual argument may be absent at runtime: the copy6! must be conditional. When the allocation is dynamic, the temp allocation and7! deallocation are also conditionals.8 9module test10interface11 subroutine scalar(i)12 integer, optional, value :: i13 end subroutine14 subroutine dyn_char(c)15 character(*), optional, value :: c16 end subroutine17 subroutine array(i)18 integer, optional, value :: i(100)19 end subroutine20 subroutine dyn_array(i, n)21 integer(8) :: n22 integer, optional, value :: i(n)23 end subroutine24 subroutine dyn_char_array(c, n)25 integer(8) :: n26 character(*), optional, value :: c(n)27 end subroutine28 function returns_ptr()29 integer, pointer :: returns_ptr30 end function31end interface32contains33 34! CHECK-LABEL: func @_QMtestPtest_scalar_not_a_var() {35subroutine test_scalar_not_a_var()36 call scalar(42)37! CHECK: %[[VAL_0:.*]] = fir.alloca i32 {adapt.valuebyref}38! CHECK: %[[VAL_1:.*]] = arith.constant 42 : i3239! CHECK: fir.store %[[VAL_1]] to %[[VAL_0]] : !fir.ref<i32>40! CHECK: fir.call @_QPscalar(%[[VAL_0]]) {{.*}}: (!fir.ref<i32>) -> ()41end subroutine42 43! CHECK-LABEL: func @_QMtestPtest_scalar(44! CHECK-SAME: %[[VAL_0:.*]]: !fir.ref<i32> {fir.bindc_name = "i", fir.optional}) {45subroutine test_scalar(i)46 integer, optional :: i47 call scalar(i)48! CHECK: %[[VAL_1:.*]] = fir.alloca i32 {adapt.valuebyref}49! CHECK: %[[VAL_2:.*]] = fir.is_present %[[VAL_0]] : (!fir.ref<i32>) -> i150! CHECK: %[[VAL_3:.*]] = fir.if %[[VAL_2]] -> (!fir.ref<i32>) {51! CHECK: %[[VAL_4:.*]] = fir.load %[[VAL_0]] : !fir.ref<i32>52! CHECK: fir.store %[[VAL_4]] to %[[VAL_1]] : !fir.ref<i32>53! CHECK: fir.result %[[VAL_1]] : !fir.ref<i32>54! CHECK: } else {55! CHECK: %[[VAL_5:.*]] = fir.absent !fir.ref<i32>56! CHECK: fir.result %[[VAL_5]] : !fir.ref<i32>57! CHECK: }58! CHECK: fir.call @_QPscalar(%[[VAL_6:.*]]) {{.*}}: (!fir.ref<i32>) -> ()59end subroutine60 61! CHECK-LABEL: func @_QMtestPtest_scalar2(62! CHECK-SAME: %[[VAL_0:.*]]: !fir.ref<i32> {fir.bindc_name = "i", fir.optional}) {63subroutine test_scalar2(i)64 integer, optional, value :: i65 call scalar(i)66! CHECK: %[[VAL_1:.*]] = fir.alloca i32 {adapt.valuebyref}67! CHECK: %[[VAL_2:.*]] = fir.is_present %[[VAL_0]] : (!fir.ref<i32>) -> i168! CHECK: %[[VAL_3:.*]] = fir.if %[[VAL_2]] -> (!fir.ref<i32>) {69! CHECK: %[[VAL_4:.*]] = fir.load %[[VAL_0]] : !fir.ref<i32>70! CHECK: fir.store %[[VAL_4]] to %[[VAL_1]] : !fir.ref<i32>71! CHECK: fir.result %[[VAL_1]] : !fir.ref<i32>72! CHECK: } else {73! CHECK: %[[VAL_5:.*]] = fir.absent !fir.ref<i32>74! CHECK: fir.result %[[VAL_5]] : !fir.ref<i32>75! CHECK: }76! CHECK: fir.call @_QPscalar(%[[VAL_6:.*]]) {{.*}}: (!fir.ref<i32>) -> ()77end subroutine78 79! CHECK-LABEL: func @_QMtestPtest_scalar3(80! CHECK-SAME: %[[VAL_0:.*]]: !fir.ref<i32> {fir.bindc_name = "i", fir.optional}) {81subroutine test_scalar3(i)82 integer, optional :: i83 ! i must be present when it appears in "()"84 call scalar((i))85! CHECK: %[[VAL_1:.*]] = fir.alloca i3286! CHECK: %[[VAL_2:.*]] = fir.load %[[VAL_0]] : !fir.ref<i32>87! CHECK: %[[VAL_3:.*]] = fir.no_reassoc %[[VAL_2]] : i3288! CHECK: fir.store %[[VAL_3]] to %[[VAL_1]] : !fir.ref<i32>89! CHECK: fir.call @_QPscalar(%[[VAL_1]]) {{.*}}: (!fir.ref<i32>) -> ()90end subroutine91 92! CHECK-LABEL: func @_QMtestPtest_scalar_ptr(93! CHECK-SAME: %[[VAL_0:.*]]: !fir.ref<!fir.box<!fir.ptr<i32>>> {fir.bindc_name = "i"}) {94subroutine test_scalar_ptr(i)95 integer, pointer :: i96 call scalar(i)97! CHECK: %[[VAL_1:.*]] = fir.alloca i32 {adapt.valuebyref}98! CHECK: %[[VAL_2:.*]] = fir.load %[[VAL_0]] : !fir.ref<!fir.box<!fir.ptr<i32>>>99! CHECK: %[[VAL_3:.*]] = fir.box_addr %[[VAL_2]] : (!fir.box<!fir.ptr<i32>>) -> !fir.ptr<i32>100! CHECK: %[[VAL_4:.*]] = fir.convert %[[VAL_3]] : (!fir.ptr<i32>) -> i64101! CHECK: %[[VAL_5:.*]] = arith.constant 0 : i64102! CHECK: %[[VAL_6:.*]] = arith.cmpi ne, %[[VAL_4]], %[[VAL_5]] : i64103! CHECK: %[[VAL_7:.*]] = fir.load %[[VAL_0]] : !fir.ref<!fir.box<!fir.ptr<i32>>>104! CHECK: %[[VAL_8:.*]] = fir.box_addr %[[VAL_7]] : (!fir.box<!fir.ptr<i32>>) -> !fir.ptr<i32>105! CHECK: %[[VAL_9:.*]] = fir.if %[[VAL_6]] -> (!fir.ref<i32>) {106! CHECK: %[[VAL_10:.*]] = fir.load %[[VAL_8]] : !fir.ptr<i32>107! CHECK: fir.store %[[VAL_10]] to %[[VAL_1]] : !fir.ref<i32>108! CHECK: fir.result %[[VAL_1]] : !fir.ref<i32>109! CHECK: } else {110! CHECK: %[[VAL_11:.*]] = fir.absent !fir.ref<i32>111! CHECK: fir.result %[[VAL_11]] : !fir.ref<i32>112! CHECK: }113! CHECK: fir.call @_QPscalar(%[[VAL_12:.*]]) {{.*}}: (!fir.ref<i32>) -> ()114end subroutine115 116! CHECK-LABEL: func @_QMtestPtest_scalar_simple_var(117! CHECK-SAME: %[[VAL_0:.*]]: !fir.ref<i32> {fir.bindc_name = "i"}) {118subroutine test_scalar_simple_var(i)119 integer :: i120 call scalar(i)121! CHECK: %[[VAL_1:.*]] = fir.alloca i32122! CHECK: %[[VAL_2:.*]] = fir.load %[[VAL_0]] : !fir.ref<i32>123! CHECK: fir.store %[[VAL_2]] to %[[VAL_1]] : !fir.ref<i32>124! CHECK: fir.call @_QPscalar(%[[VAL_1]]) {{.*}}: (!fir.ref<i32>) -> ()125end subroutine126 127 128! CHECK-LABEL: func @_QMtestPtest_scalar_alloc(129! CHECK-SAME: %[[VAL_0:.*]]: !fir.ref<!fir.box<!fir.heap<i32>>> {fir.bindc_name = "i"}) {130subroutine test_scalar_alloc(i)131 integer, allocatable :: i132 call scalar(i)133! CHECK: %[[VAL_1:.*]] = fir.alloca i32 {adapt.valuebyref}134! CHECK: %[[VAL_2:.*]] = fir.load %[[VAL_0]] : !fir.ref<!fir.box<!fir.heap<i32>>>135! CHECK: %[[VAL_3:.*]] = fir.box_addr %[[VAL_2]] : (!fir.box<!fir.heap<i32>>) -> !fir.heap<i32>136! CHECK: %[[VAL_4:.*]] = fir.convert %[[VAL_3]] : (!fir.heap<i32>) -> i64137! CHECK: %[[VAL_5:.*]] = arith.constant 0 : i64138! CHECK: %[[VAL_6:.*]] = arith.cmpi ne, %[[VAL_4]], %[[VAL_5]] : i64139! CHECK: %[[VAL_7:.*]] = fir.load %[[VAL_0]] : !fir.ref<!fir.box<!fir.heap<i32>>>140! CHECK: %[[VAL_8:.*]] = fir.box_addr %[[VAL_7]] : (!fir.box<!fir.heap<i32>>) -> !fir.heap<i32>141! CHECK: %[[VAL_9:.*]] = fir.if %[[VAL_6]] -> (!fir.ref<i32>) {142! CHECK: %[[VAL_10:.*]] = fir.load %[[VAL_8]] : !fir.heap<i32>143! CHECK: fir.store %[[VAL_10]] to %[[VAL_1]] : !fir.ref<i32>144! CHECK: fir.result %[[VAL_1]] : !fir.ref<i32>145! CHECK: } else {146! CHECK: %[[VAL_11:.*]] = fir.absent !fir.ref<i32>147! CHECK: fir.result %[[VAL_11]] : !fir.ref<i32>148! CHECK: }149! CHECK: fir.call @_QPscalar(%[[VAL_12:.*]]) {{.*}}: (!fir.ref<i32>) -> ()150end subroutine151 152! CHECK-LABEL: func @_QMtestPtest_ptr_2() {153subroutine test_ptr_2()154 call scalar(returns_ptr())155! CHECK: %[[VAL_0:.*]] = fir.alloca i32 {adapt.valuebyref}156! CHECK: %[[VAL_1:.*]] = fir.alloca !fir.box<!fir.ptr<i32>> {bindc_name = ".result"}157! CHECK: %[[VAL_2:.*]] = fir.call @_QPreturns_ptr() {{.*}}: () -> !fir.box<!fir.ptr<i32>>158! CHECK: fir.save_result %[[VAL_2]] to %[[VAL_1]] : !fir.box<!fir.ptr<i32>>, !fir.ref<!fir.box<!fir.ptr<i32>>>159! CHECK: %[[VAL_3:.*]] = fir.load %[[VAL_1]] : !fir.ref<!fir.box<!fir.ptr<i32>>>160! CHECK: %[[VAL_4:.*]] = fir.box_addr %[[VAL_3]] : (!fir.box<!fir.ptr<i32>>) -> !fir.ptr<i32>161! CHECK: %[[VAL_5:.*]] = fir.convert %[[VAL_4]] : (!fir.ptr<i32>) -> i64162! CHECK: %[[VAL_6:.*]] = arith.constant 0 : i64163! CHECK: %[[VAL_7:.*]] = arith.cmpi ne, %[[VAL_5]], %[[VAL_6]] : i64164! CHECK: %[[VAL_8:.*]] = fir.load %[[VAL_1]] : !fir.ref<!fir.box<!fir.ptr<i32>>>165! CHECK: %[[VAL_9:.*]] = fir.box_addr %[[VAL_8]] : (!fir.box<!fir.ptr<i32>>) -> !fir.ptr<i32>166! CHECK: %[[VAL_10:.*]] = fir.if %[[VAL_7]] -> (!fir.ref<i32>) {167! CHECK: %[[VAL_11:.*]] = fir.load %[[VAL_9]] : !fir.ptr<i32>168! CHECK: fir.store %[[VAL_11]] to %[[VAL_0]] : !fir.ref<i32>169! CHECK: fir.result %[[VAL_0]] : !fir.ref<i32>170! CHECK: } else {171! CHECK: %[[VAL_12:.*]] = fir.absent !fir.ref<i32>172! CHECK: fir.result %[[VAL_12]] : !fir.ref<i32>173! CHECK: }174! CHECK: fir.call @_QPscalar(%[[VAL_13:.*]]) {{.*}}: (!fir.ref<i32>) -> ()175end subroutine176 177! CHECK-LABEL: func @_QMtestPtest_array(178! CHECK-SAME: %[[VAL_0:.*]]: !fir.ref<!fir.array<100xi32>> {fir.bindc_name = "i", fir.optional}) {179subroutine test_array(i)180 integer, optional :: i(100)181 call array(i)182! CHECK: %[[VAL_1:.*]] = arith.constant 100 : index183! CHECK: %[[VAL_2:.*]] = fir.is_present %[[VAL_0]] : (!fir.ref<!fir.array<100xi32>>) -> i1184! CHECK: %[[VAL_3:.*]] = fir.if %[[VAL_2]] -> (!fir.heap<!fir.array<100xi32>>) {185! CHECK: %[[VAL_4:.*]] = fir.allocmem !fir.array<100xi32>, %[[VAL_1]] {uniq_name = ".copy"}186! CHECK: %[[VAL_5:.*]] = fir.shape %[[VAL_1]] : (index) -> !fir.shape<1>187! CHECK: %[[VAL_6:.*]] = fir.array_load %[[VAL_4]](%[[VAL_5]]) : (!fir.heap<!fir.array<100xi32>>, !fir.shape<1>) -> !fir.array<100xi32>188! CHECK: %[[VAL_7:.*]] = fir.shape %[[VAL_1]] : (index) -> !fir.shape<1>189! CHECK: %[[VAL_8:.*]] = fir.array_load %[[VAL_0]](%[[VAL_7]]) : (!fir.ref<!fir.array<100xi32>>, !fir.shape<1>) -> !fir.array<100xi32>190! CHECK: %[[VAL_9:.*]] = arith.constant 1 : index191! CHECK: %[[VAL_10:.*]] = arith.constant 0 : index192! CHECK: %[[VAL_11:.*]] = arith.subi %[[VAL_1]], %[[VAL_9]] : index193! CHECK: %[[VAL_12:.*]] = fir.do_loop %[[VAL_13:.*]] = %[[VAL_10]] to %[[VAL_11]] step %[[VAL_9]] unordered iter_args(%[[VAL_14:.*]] = %[[VAL_6]]) -> (!fir.array<100xi32>) {194! CHECK: %[[VAL_15:.*]] = fir.array_fetch %[[VAL_8]], %[[VAL_13]] : (!fir.array<100xi32>, index) -> i32195! CHECK: %[[VAL_16:.*]] = fir.array_update %[[VAL_14]], %[[VAL_15]], %[[VAL_13]] : (!fir.array<100xi32>, i32, index) -> !fir.array<100xi32>196! CHECK: fir.result %[[VAL_16]] : !fir.array<100xi32>197! CHECK: }198! CHECK: fir.array_merge_store %[[VAL_6]], %[[VAL_17:.*]] to %[[VAL_4]] : !fir.array<100xi32>, !fir.array<100xi32>, !fir.heap<!fir.array<100xi32>>199! CHECK: fir.result %[[VAL_4]] : !fir.heap<!fir.array<100xi32>>200! CHECK: } else {201! CHECK: %[[VAL_18:.*]] = fir.zero_bits !fir.heap<!fir.array<100xi32>>202! CHECK: fir.result %[[VAL_18]] : !fir.heap<!fir.array<100xi32>>203! CHECK: }204! CHECK: %[[VAL_19:.*]] = fir.convert %[[VAL_20:.*]] : (!fir.heap<!fir.array<100xi32>>) -> !fir.ref<!fir.array<100xi32>>205! CHECK: fir.call @_QParray(%[[VAL_19]]) {{.*}}: (!fir.ref<!fir.array<100xi32>>) -> ()206! CHECK: fir.if %[[VAL_2]] {207! CHECK: fir.freemem %[[VAL_20]] : !fir.heap<!fir.array<100xi32>>208! CHECK: }209end subroutine210 211! CHECK-LABEL: func @_QMtestPtest_array2(212! CHECK-SAME: %[[VAL_0:.*]]: !fir.ref<!fir.array<?xi32>> {fir.bindc_name = "i", fir.optional},213subroutine test_array2(i, n)214 integer(8) :: n215 integer, optional, value :: i(n)216 call array(i)217! CHECK-SAME: %[[VAL_1:.*]]: !fir.ref<i64> {fir.bindc_name = "n"}) {218! CHECK: %[[VAL_2:.*]] = fir.load %[[VAL_1]] : !fir.ref<i64>219! CHECK: %[[VAL_3:.*]] = fir.convert %[[VAL_2]] : (i64) -> index220! CHECK: %[[VAL_4:.*]] = arith.constant 0 : index221! CHECK: %[[VAL_5:.*]] = arith.cmpi sgt, %[[VAL_3]], %[[VAL_4]] : index222! CHECK: %[[VAL_6:.*]] = arith.select %[[VAL_5]], %[[VAL_3]], %[[VAL_4]] : index223! CHECK: %[[VAL_7:.*]] = fir.is_present %[[VAL_0]] : (!fir.ref<!fir.array<?xi32>>) -> i1224! CHECK: %[[VAL_8:.*]] = fir.if %[[VAL_7]] -> (!fir.heap<!fir.array<?xi32>>) {225! CHECK: %[[VAL_9:.*]] = fir.allocmem !fir.array<?xi32>, %[[VAL_6]] {uniq_name = ".copy"}226! CHECK: %[[VAL_17:.*]] = fir.do_loop227! CHECK: }228! CHECK: fir.array_merge_store %{{.*}}, %[[VAL_17]] to %[[VAL_9]] : !fir.array<?xi32>, !fir.array<?xi32>, !fir.heap<!fir.array<?xi32>>229! CHECK: fir.result %[[VAL_9]] : !fir.heap<!fir.array<?xi32>>230! CHECK: } else {231! CHECK: %[[VAL_23:.*]] = fir.zero_bits !fir.heap<!fir.array<?xi32>>232! CHECK: fir.result %[[VAL_23]] : !fir.heap<!fir.array<?xi32>>233! CHECK: }234! CHECK: %[[VAL_24:.*]] = fir.convert %[[VAL_8]] : (!fir.heap<!fir.array<?xi32>>) -> !fir.ref<!fir.array<100xi32>>235! CHECK: fir.call @_QParray(%[[VAL_24]]) {{.*}}: (!fir.ref<!fir.array<100xi32>>) -> ()236! CHECK: fir.if %[[VAL_7]] {237! CHECK: fir.freemem %[[VAL_8]] : !fir.heap<!fir.array<?xi32>>238! CHECK: }239end subroutine240 241! CHECK-LABEL: func @_QMtestPtest_dyn_array(242! CHECK-SAME: %[[VAL_0:.*]]: !fir.ref<!fir.array<?xi32>> {fir.bindc_name = "i", fir.optional},243! CHECK-SAME: %[[VAL_1:.*]]: !fir.ref<i64> {fir.bindc_name = "n"}) {244subroutine test_dyn_array(i, n)245 integer(8) :: n246 integer, optional :: i(n)247 call dyn_array(i, n)248! CHECK: %[[VAL_2:.*]] = fir.load %[[VAL_1]] : !fir.ref<i64>249! CHECK: %[[VAL_3:.*]] = fir.convert %[[VAL_2]] : (i64) -> index250! CHECK: %[[VAL_4:.*]] = arith.constant 0 : index251! CHECK: %[[VAL_5:.*]] = arith.cmpi sgt, %[[VAL_3]], %[[VAL_4]] : index252! CHECK: %[[VAL_6:.*]] = arith.select %[[VAL_5]], %[[VAL_3]], %[[VAL_4]] : index253! CHECK: %[[VAL_7:.*]] = fir.is_present %[[VAL_0]] : (!fir.ref<!fir.array<?xi32>>) -> i1254! CHECK: %[[VAL_8:.*]] = fir.if %[[VAL_7]] -> (!fir.heap<!fir.array<?xi32>>) {255! CHECK: %[[VAL_9:.*]] = fir.allocmem !fir.array<?xi32>, %{{.*}} {uniq_name = ".copy"}256! CHECK: %[[VAL_17:.*]] = fir.do_loop257! CHECK: }258! CHECK: fir.array_merge_store %{{.*}}, %[[VAL_17]] to %[[VAL_9]] : !fir.array<?xi32>, !fir.array<?xi32>, !fir.heap<!fir.array<?xi32>>259! CHECK: fir.result %[[VAL_9]] : !fir.heap<!fir.array<?xi32>>260! CHECK: } else {261! CHECK: %[[VAL_23:.*]] = fir.zero_bits !fir.heap<!fir.array<?xi32>>262! CHECK: fir.result %[[VAL_23]] : !fir.heap<!fir.array<?xi32>>263! CHECK: }264! CHECK: %[[VAL_24:.*]] = fir.convert %[[VAL_8]] : (!fir.heap<!fir.array<?xi32>>) -> !fir.ref<!fir.array<?xi32>>265! CHECK: fir.call @_QPdyn_array(%[[VAL_24]], %[[VAL_1]]) {{.*}}: (!fir.ref<!fir.array<?xi32>>, !fir.ref<i64>) -> ()266! CHECK: fir.if %[[VAL_7]] {267! CHECK: fir.freemem %[[VAL_8]] : !fir.heap<!fir.array<?xi32>>268! CHECK: }269end subroutine270 271! CHECK-LABEL: func @_QMtestPtest_dyn_array_from_assumed(272! CHECK-SAME: %[[VAL_0:.*]]: !fir.box<!fir.array<?xi32>> {fir.bindc_name = "i", fir.optional},273! CHECK-SAME: %[[VAL_1:.*]]: !fir.ref<i64> {fir.bindc_name = "n"}) {274subroutine test_dyn_array_from_assumed(i, n)275 integer(8) :: n276 integer, optional :: i(:)277 call dyn_array(i, n)278! CHECK: %[[VAL_2:.*]] = fir.is_present %[[VAL_0]] : (!fir.box<!fir.array<?xi32>>) -> i1279! CHECK: %[[VAL_3:.*]] = fir.zero_bits !fir.ref<!fir.array<?xi32>>280! CHECK: %[[VAL_4:.*]] = arith.constant 0 : index281! CHECK: %[[VAL_5:.*]] = fir.shape %[[VAL_4]] : (index) -> !fir.shape<1>282! CHECK: %[[VAL_6:.*]] = fir.embox %[[VAL_3]](%[[VAL_5]]) : (!fir.ref<!fir.array<?xi32>>, !fir.shape<1>) -> !fir.box<!fir.array<?xi32>>283! CHECK: %[[VAL_7:.*]] = arith.select %[[VAL_2]], %[[VAL_0]], %[[VAL_6]] : !fir.box<!fir.array<?xi32>>284! CHECK: %[[box_none:.*]] = fir.convert %[[VAL_7]] : (!fir.box<!fir.array<?xi32>>) -> !fir.box<none>285! CHECK: %[[is_contiguous:.*]] = fir.call @_FortranAIsContiguous(%[[box_none]]) {{.*}}: (!fir.box<none>) -> i1286! CHECK: %[[VAL_8:.*]] = fir.if %[[VAL_2]] -> (!fir.heap<!fir.array<?xi32>>) {287! CHECK: %[[VAL_9:.*]] = arith.constant 0 : index288! CHECK: %[[VAL_10:.*]]:3 = fir.box_dims %[[VAL_7]], %[[VAL_9]] : (!fir.box<!fir.array<?xi32>>, index) -> (index, index, index)289! CHECK: %[[VAL_11:.*]] = fir.allocmem !fir.array<?xi32>, %[[VAL_10]]#1 {uniq_name = ".copy"}290! CHECK: fir.call @_FortranAAssign291! CHECK: fir.result %[[VAL_11]] : !fir.heap<!fir.array<?xi32>>292! CHECK: } else {293! CHECK: %[[VAL_24:.*]] = fir.zero_bits !fir.heap<!fir.array<?xi32>>294! CHECK: fir.result %[[VAL_24]] : !fir.heap<!fir.array<?xi32>>295! CHECK: }296! CHECK: %[[not_contiguous:.*]] = arith.cmpi eq, %[[is_contiguous]], %false{{.*}} : i1297! CHECK: %[[and:.*]] = arith.andi %[[VAL_2]], %[[not_contiguous]] : i1298! CHECK: %[[VAL_25:.*]] = fir.convert %[[VAL_8]] : (!fir.heap<!fir.array<?xi32>>) -> !fir.ref<!fir.array<?xi32>>299! CHECK: fir.call @_QPdyn_array(%[[VAL_25]], %[[VAL_1]]) {{.*}}: (!fir.ref<!fir.array<?xi32>>, !fir.ref<i64>) -> ()300! CHECK: fir.if %[[and]] {301! CHECK: fir.zero302! CHECK: fir.call @_FortranACopyOutAssign303! CHECK: }304end subroutine305 306! CHECK-LABEL: func @_QMtestPtest_array_ptr(307! CHECK-SAME: %[[VAL_0:.*]]: !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>> {fir.bindc_name = "i"}) {308subroutine test_array_ptr(i)309 integer, pointer :: i(:)310 call array(i)311! CHECK: %[[VAL_1:.*]] = fir.alloca !fir.box<!fir.array<?xi32>>312! CHECK: %[[VAL_2:.*]] = fir.load %[[VAL_0]] : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>313! CHECK: %[[VAL_3:.*]] = fir.box_addr %[[VAL_2]] : (!fir.box<!fir.ptr<!fir.array<?xi32>>>) -> !fir.ptr<!fir.array<?xi32>>314! CHECK: %[[VAL_4:.*]] = fir.convert %[[VAL_3]] : (!fir.ptr<!fir.array<?xi32>>) -> i64315! CHECK: %[[VAL_5:.*]] = arith.constant 0 : i64316! CHECK: %[[VAL_6:.*]] = arith.cmpi ne, %[[VAL_4]], %[[VAL_5]] : i64317! CHECK: %[[VAL_7:.*]] = fir.load %[[VAL_0]] : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>318! CHECK: %[[VAL_8:.*]] = fir.convert %[[VAL_7]] : (!fir.box<!fir.ptr<!fir.array<?xi32>>>) -> !fir.box<none>319! CHECK: %[[VAL_9:.*]] = fir.call @_FortranAIsContiguous(%[[VAL_8]]) fastmath<contract> : (!fir.box<none>) -> i1320! CHECK: %[[VAL_10:.*]] = fir.if %[[VAL_6]] -> (!fir.heap<!fir.array<?xi32>>) {321! CHECK: %[[VAL_11:.*]] = fir.if %[[VAL_9]] -> (!fir.heap<!fir.array<?xi32>>) {322! CHECK: %[[VAL_12:.*]] = fir.box_addr %[[VAL_7]] : (!fir.box<!fir.ptr<!fir.array<?xi32>>>) -> !fir.heap<!fir.array<?xi32>>323! CHECK: fir.result %[[VAL_12]] : !fir.heap<!fir.array<?xi32>>324! CHECK: } else {325! CHECK: %[[VAL_13:.*]] = arith.constant 0 : index326! CHECK: %[[VAL_14:.*]]:3 = fir.box_dims %[[VAL_7]], %[[VAL_13]] : (!fir.box<!fir.ptr<!fir.array<?xi32>>>, index) -> (index, index, index)327! CHECK: %[[VAL_15:.*]] = fir.allocmem !fir.array<?xi32>, %[[VAL_14]]#1 {uniq_name = ".copy"}328! CHECK: %[[VAL_16:.*]] = fir.shape %[[VAL_14]]#1 : (index) -> !fir.shape<1>329! CHECK: %[[VAL_17:.*]] = fir.embox %[[VAL_15]](%[[VAL_16]]) : (!fir.heap<!fir.array<?xi32>>, !fir.shape<1>) -> !fir.box<!fir.array<?xi32>>330! CHECK: fir.store %[[VAL_17]] to %[[VAL_1]] : !fir.ref<!fir.box<!fir.array<?xi32>>>331! CHECK: %[[VAL_18:.*]] = fir.address_of(@_QQclX{{.*}}) : !fir.ref<!fir.char<1,{{.*}}>>332! CHECK: %[[VAL_19:.*]] = arith.constant {{.*}} : i32333! CHECK: %[[VAL_20:.*]] = fir.convert %[[VAL_1]] : (!fir.ref<!fir.box<!fir.array<?xi32>>>) -> !fir.ref<!fir.box<none>>334! CHECK: %[[VAL_21:.*]] = fir.convert %[[VAL_7]] : (!fir.box<!fir.ptr<!fir.array<?xi32>>>) -> !fir.box<none>335! CHECK: %[[VAL_22:.*]] = fir.convert %[[VAL_18]] : (!fir.ref<!fir.char<1,{{.*}}>>) -> !fir.ref<i8>336! CHECK: fir.call @_FortranAAssignTemporary(%[[VAL_20]], %[[VAL_21]], %[[VAL_22]], %[[VAL_19]]) fastmath<contract> : (!fir.ref<!fir.box<none>>, !fir.box<none>, !fir.ref<i8>, i32) -> ()337! CHECK: fir.result %[[VAL_15]] : !fir.heap<!fir.array<?xi32>>338! CHECK: }339! CHECK: fir.result %[[VAL_24:.*]] : !fir.heap<!fir.array<?xi32>>340! CHECK: } else {341! CHECK: %[[VAL_25:.*]] = fir.zero_bits !fir.heap<!fir.array<?xi32>>342! CHECK: fir.result %[[VAL_25]] : !fir.heap<!fir.array<?xi32>>343! CHECK: }344! CHECK: %[[VAL_26:.*]] = arith.constant false345! CHECK: %[[VAL_27:.*]] = arith.cmpi eq, %[[VAL_9]], %[[VAL_26]] : i1346! CHECK: %[[VAL_28:.*]] = arith.andi %[[VAL_6]], %[[VAL_27]] : i1347! CHECK: %[[VAL_29:.*]] = fir.convert %[[VAL_30:.*]] : (!fir.heap<!fir.array<?xi32>>) -> !fir.ref<!fir.array<100xi32>>348! CHECK: fir.call @_QParray(%[[VAL_29]]) fastmath<contract> : (!fir.ref<!fir.array<100xi32>>) -> ()349! CHECK: fir.if %[[VAL_28]] {350! CHECK: fir.zero351! CHECK: fir.call @_FortranACopyOutAssign352! CHECK: }353! CHECK: return354! CHECK: }355end subroutine356 357! CHECK-LABEL: func @_QMtestPtest_char(358! CHECK-SAME: %[[VAL_0:.*]]: !fir.boxchar<1> {fir.bindc_name = "c", fir.optional}) {359subroutine test_char(c)360 character(*), optional :: c361 call dyn_char(c)362! CHECK: %[[VAL_1:.*]]:2 = fir.unboxchar %[[VAL_0]] : (!fir.boxchar<1>) -> (!fir.ref<!fir.char<1,?>>, index)363! CHECK: %[[VAL_2:.*]] = fir.is_present %[[VAL_1]]#0 : (!fir.ref<!fir.char<1,?>>) -> i1364! CHECK: %[[VAL_3:.*]] = arith.constant 0 : index365! CHECK: %[[VAL_4:.*]] = arith.select %[[VAL_2]], %[[VAL_1]]#1, %[[VAL_3]] : index366! CHECK: %[[VAL_5:.*]] = fir.alloca !fir.char<1,?>(%[[VAL_4]] : index) {adapt.valuebyref}367! CHECK: %[[VAL_6:.*]] = fir.if %[[VAL_2]] -> (!fir.ref<!fir.char<1,?>>) {368! CHECK: %[[VAL_13:.*]] = fir.convert %[[VAL_5]] : (!fir.ref<!fir.char<1,?>>) -> !llvm.ptr369! CHECK: %[[VAL_14:.*]] = fir.convert %[[VAL_1]]#0 : (!fir.ref<!fir.char<1,?>>) -> !llvm.ptr370! CHECK: "llvm.intr.memmove"(%[[VAL_13]], %[[VAL_14]], %{{.*}}) <{isVolatile = false}> : (!llvm.ptr, !llvm.ptr, i64) -> ()371! CHECK: fir.result %[[VAL_5]] : !fir.ref<!fir.char<1,?>>372! CHECK: } else {373! CHECK: %[[VAL_24:.*]] = fir.absent !fir.ref<!fir.char<1,?>>374! CHECK: fir.result %[[VAL_24]] : !fir.ref<!fir.char<1,?>>375! CHECK: }376! CHECK: %[[VAL_25:.*]] = fir.emboxchar %[[VAL_6]], %[[VAL_4]] : (!fir.ref<!fir.char<1,?>>, index) -> !fir.boxchar<1>377! CHECK: fir.call @_QPdyn_char(%[[VAL_25]]) {{.*}}: (!fir.boxchar<1>) -> ()378end subroutine379 380! CHECK-LABEL: func @_QMtestPtest_char_ptr(381! CHECK-SAME: %[[VAL_0:.*]]: !fir.ref<!fir.box<!fir.ptr<!fir.char<1,?>>>> {fir.bindc_name = "c"}) {382subroutine test_char_ptr(c)383 character(:), pointer :: c384 call dyn_char(c)385! CHECK: %[[VAL_1:.*]] = fir.load %[[VAL_0]] : !fir.ref<!fir.box<!fir.ptr<!fir.char<1,?>>>>386! CHECK: %[[VAL_2:.*]] = fir.box_addr %[[VAL_1]] : (!fir.box<!fir.ptr<!fir.char<1,?>>>) -> !fir.ptr<!fir.char<1,?>>387! CHECK: %[[VAL_3:.*]] = fir.convert %[[VAL_2]] : (!fir.ptr<!fir.char<1,?>>) -> i64388! CHECK: %[[VAL_4:.*]] = arith.constant 0 : i64389! CHECK: %[[VAL_5:.*]] = arith.cmpi ne, %[[VAL_3]], %[[VAL_4]] : i64390! CHECK: %[[VAL_6:.*]] = fir.load %[[VAL_0]] : !fir.ref<!fir.box<!fir.ptr<!fir.char<1,?>>>>391! CHECK: %[[VAL_7:.*]] = fir.box_elesize %[[VAL_6]] : (!fir.box<!fir.ptr<!fir.char<1,?>>>) -> index392! CHECK: %[[VAL_8:.*]] = fir.box_addr %[[VAL_6]] : (!fir.box<!fir.ptr<!fir.char<1,?>>>) -> !fir.ptr<!fir.char<1,?>>393! CHECK: %[[VAL_9:.*]] = arith.constant 0 : index394! CHECK: %[[VAL_10:.*]] = arith.select %[[VAL_5]], %[[VAL_7]], %[[VAL_9]] : index395! CHECK: %[[VAL_11:.*]] = fir.alloca !fir.char<1,?>(%[[VAL_10]] : index) {adapt.valuebyref}396! CHECK: %[[VAL_12:.*]] = fir.if %[[VAL_5]] -> (!fir.ref<!fir.char<1,?>>) {397! CHECK: %[[VAL_19:.*]] = fir.convert %[[VAL_11]] : (!fir.ref<!fir.char<1,?>>) -> !llvm.ptr398! CHECK: %[[VAL_20:.*]] = fir.convert %[[VAL_8]] : (!fir.ptr<!fir.char<1,?>>) -> !llvm.ptr399! CHECK: "llvm.intr.memmove"(%[[VAL_19]], %[[VAL_20]], %{{.*}}) <{isVolatile = false}> : (!llvm.ptr, !llvm.ptr, i64) -> ()400! CHECK: fir.result %[[VAL_11]] : !fir.ref<!fir.char<1,?>>401! CHECK: } else {402! CHECK: %[[VAL_30:.*]] = fir.absent !fir.ref<!fir.char<1,?>>403! CHECK: fir.result %[[VAL_30]] : !fir.ref<!fir.char<1,?>>404! CHECK: }405! CHECK: %[[VAL_31:.*]] = fir.emboxchar %[[VAL_12]], %[[VAL_10]] : (!fir.ref<!fir.char<1,?>>, index) -> !fir.boxchar<1>406! CHECK: fir.call @_QPdyn_char(%[[VAL_31]]) {{.*}}: (!fir.boxchar<1>) -> ()407end subroutine408 409! CHECK-LABEL: func @_QMtestPtest_char_array(410! CHECK-SAME: %[[VAL_0:.*]]: !fir.box<!fir.array<?x!fir.char<1,?>>> {fir.bindc_name = "c", fir.optional}) {411subroutine test_char_array(c)412 integer(8) :: n413 character(*), optional :: c(:)414 call dyn_char_array(c, n)415! CHECK: %[[VAL_1:.*]] = fir.alloca !fir.box<!fir.array<?x!fir.char<1,?>>>416! CHECK: %[[VAL_2:.*]] = fir.alloca i64 {bindc_name = "n", uniq_name = "_QMtestFtest_char_arrayEn"}417! CHECK: %[[VAL_3:.*]] = fir.is_present %[[VAL_0]] : (!fir.box<!fir.array<?x!fir.char<1,?>>>) -> i1418! CHECK: %[[VAL_4:.*]] = fir.zero_bits !fir.ref<!fir.array<?x!fir.char<1,?>>>419! CHECK: %[[VAL_5:.*]] = arith.constant 0 : index420! CHECK: %[[VAL_6:.*]] = fir.shape %[[VAL_5]] : (index) -> !fir.shape<1>421! CHECK: %[[VAL_7:.*]] = arith.constant 0 : index422! CHECK: %[[VAL_8:.*]] = fir.embox %[[VAL_4]](%[[VAL_6]]) typeparams %[[VAL_7]] : (!fir.ref<!fir.array<?x!fir.char<1,?>>>, !fir.shape<1>, index) -> !fir.box<!fir.array<?x!fir.char<1,?>>>423! CHECK: %[[VAL_9:.*]] = arith.select %[[VAL_3]], %[[VAL_0]], %[[VAL_8]] : !fir.box<!fir.array<?x!fir.char<1,?>>>424! CHECK: %[[VAL_10:.*]] = fir.convert %[[VAL_9]] : (!fir.box<!fir.array<?x!fir.char<1,?>>>) -> !fir.box<none>425! CHECK: %[[VAL_11:.*]] = fir.call @_FortranAIsContiguous(%[[VAL_10]]) fastmath<contract> : (!fir.box<none>) -> i1426! CHECK: %[[VAL_12:.*]] = fir.if %[[VAL_3]] -> (!fir.heap<!fir.array<?x!fir.char<1,?>>>) {427! CHECK: %[[VAL_13:.*]] = fir.if %[[VAL_11]] -> (!fir.heap<!fir.array<?x!fir.char<1,?>>>) {428! CHECK: %[[VAL_14:.*]] = fir.box_addr %[[VAL_9]] : (!fir.box<!fir.array<?x!fir.char<1,?>>>) -> !fir.heap<!fir.array<?x!fir.char<1,?>>>429! CHECK: fir.result %[[VAL_14]] : !fir.heap<!fir.array<?x!fir.char<1,?>>>430! CHECK: } else {431! CHECK: %[[VAL_15:.*]] = arith.constant 0 : index432! CHECK: %[[VAL_16:.*]]:3 = fir.box_dims %[[VAL_9]], %[[VAL_15]] : (!fir.box<!fir.array<?x!fir.char<1,?>>>, index) -> (index, index, index)433! CHECK: %[[VAL_17:.*]] = fir.box_elesize %[[VAL_9]] : (!fir.box<!fir.array<?x!fir.char<1,?>>>) -> index434! CHECK: %[[VAL_18:.*]] = fir.allocmem !fir.array<?x!fir.char<1,?>>(%[[VAL_17]] : index), %[[VAL_16]]#1 {uniq_name = ".copy"}435! CHECK: %[[VAL_19:.*]] = fir.shape %[[VAL_16]]#1 : (index) -> !fir.shape<1>436! CHECK: %[[VAL_20:.*]] = fir.embox %[[VAL_18]](%[[VAL_19]]) typeparams %[[VAL_17]] : (!fir.heap<!fir.array<?x!fir.char<1,?>>>, !fir.shape<1>, index) -> !fir.box<!fir.array<?x!fir.char<1,?>>>437! CHECK: fir.store %[[VAL_20]] to %[[VAL_1]] : !fir.ref<!fir.box<!fir.array<?x!fir.char<1,?>>>>438! CHECK: %[[VAL_21:.*]] = fir.address_of(@_QQclX{{.*}}) : !fir.ref<!fir.char<1,{{.*}}>>439! CHECK: %[[VAL_22:.*]] = arith.constant {{.*}} : i32440! CHECK: %[[VAL_23:.*]] = fir.convert %[[VAL_1]] : (!fir.ref<!fir.box<!fir.array<?x!fir.char<1,?>>>>) -> !fir.ref<!fir.box<none>>441! CHECK: %[[VAL_24:.*]] = fir.convert %[[VAL_9]] : (!fir.box<!fir.array<?x!fir.char<1,?>>>) -> !fir.box<none>442! CHECK: %[[VAL_25:.*]] = fir.convert %[[VAL_21]] : (!fir.ref<!fir.char<1,{{.*}}>>) -> !fir.ref<i8>443! CHECK: fir.call @_FortranAAssignTemporary(%[[VAL_23]], %[[VAL_24]], %[[VAL_25]], %[[VAL_22]]) fastmath<contract> : (!fir.ref<!fir.box<none>>, !fir.box<none>, !fir.ref<i8>, i32) -> ()444! CHECK: fir.result %[[VAL_18]] : !fir.heap<!fir.array<?x!fir.char<1,?>>>445! CHECK: }446! CHECK: fir.result %[[VAL_27:.*]] : !fir.heap<!fir.array<?x!fir.char<1,?>>>447! CHECK: } else {448! CHECK: %[[VAL_28:.*]] = fir.zero_bits !fir.heap<!fir.array<?x!fir.char<1,?>>>449! CHECK: fir.result %[[VAL_28]] : !fir.heap<!fir.array<?x!fir.char<1,?>>>450! CHECK: }451! CHECK: %[[VAL_29:.*]] = fir.box_elesize %[[VAL_9]] : (!fir.box<!fir.array<?x!fir.char<1,?>>>) -> index452! CHECK: %[[VAL_30:.*]] = arith.constant false453! CHECK: %[[VAL_31:.*]] = arith.cmpi eq, %[[VAL_11]], %[[VAL_30]] : i1454! CHECK: %[[VAL_32:.*]] = arith.andi %[[VAL_3]], %[[VAL_31]] : i1455! CHECK: %[[VAL_33:.*]] = fir.convert %[[VAL_34:.*]] : (!fir.heap<!fir.array<?x!fir.char<1,?>>>) -> !fir.ref<!fir.char<1,?>>456! CHECK: %[[VAL_35:.*]] = fir.emboxchar %[[VAL_33]], %[[VAL_29]] : (!fir.ref<!fir.char<1,?>>, index) -> !fir.boxchar<1>457! CHECK: fir.call @_QPdyn_char_array(%[[VAL_35]], %[[VAL_2]]) fastmath<contract> : (!fir.boxchar<1>, !fir.ref<i64>) -> ()458! CHECK: fir.if %[[VAL_32]] {459! CHECK: fir.zero460! CHECK: fir.call @_FortranACopyOutAssign461! CHECK: }462! CHECK: return463! CHECK: }464end subroutine465end466