|
| 1 | +! Test lowering of character concatenation to HLFIR |
| 2 | +! RUN: bbc -emit-hlfir -o - %s 2>&1 | FileCheck %s |
| 3 | + |
| 4 | +subroutine charconvert1(c,n) |
| 5 | + character(*,4),intent(in) :: c(:) |
| 6 | + integer,intent(in) :: n |
| 7 | + interface |
| 8 | + subroutine callee(c) |
| 9 | + character(*),intent(in) :: c(:) |
| 10 | + end subroutine callee |
| 11 | + end interface |
| 12 | + call show([character(n)::c]) |
| 13 | +end subroutine charconvert1 |
| 14 | + |
| 15 | +! CHECK-LABEL: func.func @_QPcharconvert1 |
| 16 | +! CHECK: %[[VAL_2:.*]]:2 = hlfir.declare %{{.*}} {fortran_attrs = #fir.var_attrs<intent_in>, uniq_name = "_QFcharconvert1Ec"} : (!fir.box<!fir.array<?x!fir.char<4,?>>>) -> (!fir.box<!fir.array<?x!fir.char<4,?>>>, !fir.box<!fir.array<?x!fir.char<4,?>>>) |
| 17 | +! CHECK: ^bb0(%[[ARG2:.*]]: index): |
| 18 | +! CHECK: %[[VAL_37:.*]] = fir.box_elesize %[[VAL_2]]#1 : (!fir.box<!fir.array<?x!fir.char<4,?>>>) -> index |
| 19 | +! CHECK: %[[C4_4:.*]] = arith.constant 4 : index |
| 20 | +! CHECK: %[[VAL_38:.*]] = arith.divsi %[[VAL_37]], %[[C4_4]] : index |
| 21 | +! CHECK: %[[VAL_39:.*]] = hlfir.designate %[[VAL_2]]#0 (%[[ARG2]]) typeparams %[[VAL_38]] : (!fir.box<!fir.array<?x!fir.char<4,?>>>, index, index) -> !fir.boxchar<4> |
| 22 | +! CHECK: %[[C4_5:.*]] = arith.constant 4 : index |
| 23 | +! CHECK: %[[VAL_40:.*]] = arith.muli %[[VAL_38]], %[[C4_5]] : index |
| 24 | +! CHECK: %[[VAL_41:.*]] = fir.alloca !fir.char<1,?>(%[[VAL_40]] : index) |
| 25 | +! CHECK: %[[VAL_42:.*]]:2 = fir.unboxchar %[[VAL_39]] : (!fir.boxchar<4>) -> (!fir.ref<!fir.char<4,?>>, index) |
| 26 | +! CHECK: fir.char_convert %[[VAL_42]]#0 for %[[VAL_38:.*]] to %[[VAL_41]] : !fir.ref<!fir.char<4,?>>, index, !fir.ref<!fir.char<1,?>> |
| 27 | +! CHECK: %[[VAL_43:.*]]:2 = hlfir.declare %[[VAL_41]] typeparams %[[VAL_38]] {uniq_name = "ctor.temp"} : (!fir.ref<!fir.char<1,?>>, index) -> (!fir.boxchar<1>, !fir.ref<!fir.char<1,?>>) |
| 28 | +! CHECK: hlfir.yield_element %[[VAL_43]]#0 : !fir.boxchar<1> |
| 29 | +! CHECK: } |
| 30 | + |
| 31 | +subroutine test2(x) |
| 32 | + integer,intent(in) :: x |
| 33 | + character(kind=4) :: cx |
| 34 | + cx = achar(x) |
| 35 | +end subroutine test2 |
| 36 | +! CHECK-LABEL: func.func @_QPtest2 |
| 37 | +! CHECK-SAME: %[[ARG0:.*]]: !fir.ref<i32> |
| 38 | +! CHECK: %[[VAL_0:.*]] = fir.alloca !fir.char<1> |
| 39 | +! CHECK: %[[C1:.*]] = arith.constant 1 : index |
| 40 | +! CHECK: %[[VAL_1:.*]] = fir.alloca !fir.char<4> {bindc_name = "cx", uniq_name = "_QFtest2Ecx"} |
| 41 | +! CHECK: %[[VAL_2:.*]]:2 = hlfir.declare %[[VAL_1]] typeparams %[[C1]] {uniq_name = "_QFtest2Ecx"} : (!fir.ref<!fir.char<4>>, index) -> (!fir.ref<!fir.char<4>>, !fir.ref<!fir.char<4>>) |
| 42 | +! CHECK: %[[VAL_3:.*]]:2 = hlfir.declare %[[ARG0]] {fortran_attrs = #fir.var_attrs<intent_in>, uniq_name = "_QFtest2Ex"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>) |
| 43 | +! CHECK: %[[VAL_4:.*]] = fir.load %[[VAL_3]]#0 : !fir.ref<i32> |
| 44 | +! CHECK: %[[VAL_5:.*]] = fir.convert %[[VAL_4]] : (i32) -> i64 |
| 45 | +! CHECK: %[[VAL_6:.*]] = fir.convert %[[VAL_5]] : (i64) -> i8 |
| 46 | +! CHECK: %[[VAL_7:.*]] = fir.undefined !fir.char<1> |
| 47 | +! CHECK: %[[VAL_8:.*]] = fir.insert_value %[[VAL_7]], %[[VAL_6]], [0 : index] : (!fir.char<1>, i8) -> !fir.char<1> |
| 48 | +! CHECK: fir.store %[[VAL_8:.*]] to %[[VAL_0]] : !fir.ref<!fir.char<1>> |
| 49 | +! CHECK: %[[FALSE:.*]] = arith.constant false |
| 50 | +! CHECK: %[[VAL_9:.*]] = hlfir.as_expr %[[VAL_0]] move %[[FALSE]] : (!fir.ref<!fir.char<1>>, i1) -> !hlfir.expr<!fir.char<1>> |
| 51 | +! CHECK: %[[C1_0:.*]] = arith.constant 1 : index |
| 52 | +! CHECK: %[[VAL_10:.*]] = fir.alloca !fir.char<4,?>(%[[C1_0]] : index) |
| 53 | +! CHECK: fir.char_convert %[[VAL_0:.*]] for %[[C1_0]] to %[[VAL_10]] : !fir.ref<!fir.char<1>>, index, !fir.ref<!fir.char<4,?>> |
| 54 | +! CHECK: %[[VAL_11:.*]]:2 = hlfir.declare %[[VAL_10]] typeparams %[[C1_0]] {uniq_name = "ctor.temp"} : (!fir.ref<!fir.char<4,?>>, index) -> (!fir.boxchar<4>, !fir.ref<!fir.char<4,?>>) |
| 55 | +! CHECK: %[[C1_I64:.*]] = arith.constant 1 : i64 |
| 56 | +! CHECK: %[[VAL_12:.*]] = hlfir.set_length %[[VAL_11]]#0 len %[[C1_I64]] : (!fir.boxchar<4>, i64) -> !hlfir.expr<!fir.char<4>> |
| 57 | +! CHECK: hlfir.assign %[[VAL_12:.*]] to %[[VAL_2]]#0 : !hlfir.expr<!fir.char<4>>, !fir.ref<!fir.char<4>> |
| 58 | +! CHECK: hlfir.destroy %[[VAL_9:.*]] : !hlfir.expr<!fir.char<1>> |
| 59 | +! CHECK: return |
| 60 | +! CHECK: } |
0 commit comments