1// Test hlfir.assign operation parse, verify (no errors), and unparse. 2 3// RUN: fir-opt %s | fir-opt | FileCheck %s 4 5func.func @scalar_logical(%arg0: !fir.ref<!fir.logical<1>>, %arg1: !fir.ref<!fir.logical<1>>) { 6 hlfir.assign %arg1 to %arg0 : !fir.ref<!fir.logical<1>>, !fir.ref<!fir.logical<1>> 7 return 8} 9// CHECK-LABEL: func.func @scalar_logical( 10// CHECK-SAME: %[[VAL_0:.*]]: !fir.ref<!fir.logical<1>>, 11// CHECK-SAME: %[[VAL_1:.*]]: !fir.ref<!fir.logical<1>>) { 12// CHECK: hlfir.assign %[[VAL_1]] to %[[VAL_0]] : !fir.ref<!fir.logical<1>>, !fir.ref<!fir.logical<1>> 13 14func.func @scalar_logical_2(%arg0: !fir.ref<!fir.logical<1>>, %arg1: i1) { 15 hlfir.assign %arg1 to %arg0 : i1, !fir.ref<!fir.logical<1>> 16 return 17} 18// CHECK-LABEL: func.func @scalar_logical_2( 19// CHECK-SAME: %[[VAL_0:.*]]: !fir.ref<!fir.logical<1>>, 20// CHECK-SAME: %[[VAL_1:.*]]: i1) { 21// CHECK: hlfir.assign %[[VAL_1]] to %[[VAL_0]] : i1, !fir.ref<!fir.logical<1>> 22 23func.func @scalar_integer(%arg0: !fir.ref<i32>, %arg1: !fir.ref<i32>) { 24 hlfir.assign %arg1 to %arg0 : !fir.ref<i32>, !fir.ref<i32> 25 return 26} 27// CHECK-LABEL: func.func @scalar_integer( 28// CHECK-SAME: %[[VAL_0:.*]]: !fir.ref<i32>, 29// CHECK-SAME: %[[VAL_1:.*]]: !fir.ref<i32>) { 30// CHECK: hlfir.assign %[[VAL_1]] to %[[VAL_0]] : !fir.ref<i32>, !fir.ref<i32> 31 32func.func @scalar_integer_2(%arg0: !fir.ref<i32>, %arg1: i32) { 33 hlfir.assign %arg1 to %arg0 : i32, !fir.ref<i32> 34 return 35} 36// CHECK-LABEL: func.func @scalar_integer_2( 37// CHECK-SAME: %[[VAL_0:.*]]: !fir.ref<i32>, 38// CHECK-SAME: %[[VAL_1:.*]]: i32) { 39// CHECK: hlfir.assign %[[VAL_1]] to %[[VAL_0]] : i32, !fir.ref<i32> 40 41func.func @scalar_real(%arg0: !fir.ref<f16>, %arg1: !fir.ref<f16>) { 42 hlfir.assign %arg1 to %arg0 : !fir.ref<f16>, !fir.ref<f16> 43 return 44} 45// CHECK-LABEL: func.func @scalar_real( 46// CHECK-SAME: %[[VAL_0:.*]]: !fir.ref<f16>, 47// CHECK-SAME: %[[VAL_1:.*]]: !fir.ref<f16>) { 48// CHECK: hlfir.assign %[[VAL_1]] to %[[VAL_0]] : !fir.ref<f16>, !fir.ref<f16> 49 50func.func @scalar_complex(%arg0: !fir.ref<complex<f64>>, %arg1: !fir.ref<complex<f64>>) { 51 hlfir.assign %arg1 to %arg0 : !fir.ref<complex<f64>>, !fir.ref<complex<f64>> 52 return 53} 54// CHECK-LABEL: func.func @scalar_complex( 55// CHECK-SAME: %[[VAL_0:.*]]: !fir.ref<complex<f64>>, 56// CHECK-SAME: %[[VAL_1:.*]]: !fir.ref<complex<f64>>) { 57// CHECK: hlfir.assign %[[VAL_1]] to %[[VAL_0]] : !fir.ref<complex<f64>>, !fir.ref<complex<f64>> 58 59func.func @scalar_complex_2(%arg0: !fir.ref<complex<f64>>, %arg1: complex<f64>) { 60 hlfir.assign %arg1 to %arg0 : complex<f64>, !fir.ref<complex<f64>> 61 return 62} 63// CHECK-LABEL: func.func @scalar_complex_2( 64// CHECK-SAME: %[[VAL_0:.*]]: !fir.ref<complex<f64>>, 65// CHECK-SAME: %[[VAL_1:.*]]: complex<f64>) { 66// CHECK: hlfir.assign %[[VAL_1]] to %[[VAL_0]] : complex<f64>, !fir.ref<complex<f64>> 67 68 69func.func @scalar_character(%arg0: !fir.boxchar<1>, %arg1: !fir.boxchar<1>) { 70 hlfir.assign %arg1 to %arg0 : !fir.boxchar<1>, !fir.boxchar<1> 71 return 72} 73// CHECK-LABEL: func.func @scalar_character( 74// CHECK-SAME: %[[VAL_0:.*]]: !fir.boxchar<1>, 75// CHECK-SAME: %[[VAL_1:.*]]: !fir.boxchar<1>) { 76// CHECK: hlfir.assign %[[VAL_1]] to %[[VAL_0]] : !fir.boxchar<1>, !fir.boxchar<1> 77 78func.func @scalar_character_2(%arg0: !fir.ref<!fir.char<1,32>>, %arg1: !fir.ref<!fir.char<1,64>>) { 79 hlfir.assign %arg1 to %arg0 : !fir.ref<!fir.char<1,64>>, !fir.ref<!fir.char<1,32>> 80 return 81} 82// CHECK-LABEL: func.func @scalar_character_2( 83// CHECK-SAME: %[[VAL_0:.*]]: !fir.ref<!fir.char<1,32>>, 84// CHECK-SAME: %[[VAL_1:.*]]: !fir.ref<!fir.char<1,64>>) { 85// CHECK: hlfir.assign %[[VAL_1]] to %[[VAL_0]] : !fir.ref<!fir.char<1,64>>, !fir.ref<!fir.char<1,32>> 86 87func.func @scalar_character_3(%arg0: !fir.boxchar<1>, %arg1: !hlfir.expr<!fir.char<1,?>>) { 88 hlfir.assign %arg1 to %arg0 : !hlfir.expr<!fir.char<1,?>>, !fir.boxchar<1> 89 return 90} 91// CHECK-LABEL: func.func @scalar_character_3( 92// CHECK-SAME: %[[VAL_0:.*]]: !fir.boxchar<1>, 93// CHECK-SAME: %[[VAL_1:.*]]: !hlfir.expr<!fir.char<1,?>>) { 94// CHECK: hlfir.assign %[[VAL_1]] to %[[VAL_0]] : !hlfir.expr<!fir.char<1,?>>, !fir.boxchar<1> 95 96func.func @array(%arg0: !fir.ref<!fir.array<10xi32>>, %arg1: i32) { 97 hlfir.assign %arg1 to %arg0 : i32, !fir.ref<!fir.array<10xi32>> 98 return 99} 100// CHECK-LABEL: func.func @array( 101// CHECK-SAME: %[[VAL_0:.*]]: !fir.ref<!fir.array<10xi32>>, 102// CHECK-SAME: %[[VAL_1:.*]]: i32) { 103// CHECK: hlfir.assign %[[VAL_1]] to %[[VAL_0]] : i32, !fir.ref<!fir.array<10xi32>> 104 105func.func @array_2(%arg0: !fir.ref<!fir.array<10xi32>>, %arg1: !hlfir.expr<?xi32>) { 106 hlfir.assign %arg1 to %arg0 : !hlfir.expr<?xi32>, !fir.ref<!fir.array<10xi32>> 107 return 108} 109// CHECK-LABEL: func.func @array_2( 110// CHECK-SAME: %[[VAL_0:.*]]: !fir.ref<!fir.array<10xi32>>, 111// CHECK-SAME: %[[VAL_1:.*]]: !hlfir.expr<?xi32>) { 112// CHECK: hlfir.assign %[[VAL_1]] to %[[VAL_0]] : !hlfir.expr<?xi32>, !fir.ref<!fir.array<10xi32>> 113 114func.func @array_3(%arg0: !fir.box<!fir.array<?xi32>>, %arg1: !hlfir.expr<?xi32>) { 115 hlfir.assign %arg1 to %arg0 : !hlfir.expr<?xi32>, !fir.box<!fir.array<?xi32>> 116 return 117} 118// CHECK-LABEL: func.func @array_3( 119// CHECK-SAME: %[[VAL_0:.*]]: !fir.box<!fir.array<?xi32>>, 120// CHECK-SAME: %[[VAL_1:.*]]: !hlfir.expr<?xi32>) { 121// CHECK: hlfir.assign %[[VAL_1]] to %[[VAL_0]] : !hlfir.expr<?xi32>, !fir.box<!fir.array<?xi32>> 122 123func.func @array_4(%arg0: !fir.box<!fir.array<?xi32>>, %arg1: !fir.box<!fir.array<?xi32>>) { 124 hlfir.assign %arg1 to %arg0 : !fir.box<!fir.array<?xi32>>, !fir.box<!fir.array<?xi32>> 125 return 126} 127// CHECK-LABEL: func.func @array_4( 128// CHECK-SAME: %[[VAL_0:.*]]: !fir.box<!fir.array<?xi32>>, 129// CHECK-SAME: %[[VAL_1:.*]]: !fir.box<!fir.array<?xi32>>) { 130// CHECK: hlfir.assign %[[VAL_1]] to %[[VAL_0]] : !fir.box<!fir.array<?xi32>>, !fir.box<!fir.array<?xi32>> 131 132func.func @alloc_assign(%arg0: !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>, %arg1: !fir.box<!fir.array<?xi32>>) { 133 hlfir.assign %arg1 to %arg0 realloc : !fir.box<!fir.array<?xi32>>, !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>> 134 return 135} 136// CHECK-LABEL: func.func @alloc_assign( 137// CHECK-SAME: %[[VAL_0:.*]]: !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>, 138// CHECK-SAME: %[[VAL_1:.*]]: !fir.box<!fir.array<?xi32>>) { 139// CHECK: hlfir.assign %[[VAL_1]] to %[[VAL_0]] realloc : !fir.box<!fir.array<?xi32>>, !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>> 140 141func.func @alloc_assign_keep_lhs_len(%arg0: !fir.ref<!fir.box<!fir.heap<!fir.array<?x!fir.char<1,?>>>>>, %arg1: !fir.box<!fir.array<?x!fir.char<1,?>>>) { 142 hlfir.assign %arg1 to %arg0 realloc keep_lhs_len : !fir.box<!fir.array<?x!fir.char<1,?>>>, !fir.ref<!fir.box<!fir.heap<!fir.array<?x!fir.char<1,?>>>>> 143 return 144} 145// CHECK-LABEL: func.func @alloc_assign_keep_lhs_len( 146// CHECK-SAME: %[[VAL_0:.*]]: !fir.ref<!fir.box<!fir.heap<!fir.array<?x!fir.char<1,?>>>>>, 147// CHECK-SAME: %[[VAL_1:.*]]: !fir.box<!fir.array<?x!fir.char<1,?>>>) { 148// CHECK: hlfir.assign %[[VAL_1]] to %[[VAL_0]] realloc keep_lhs_len : !fir.box<!fir.array<?x!fir.char<1,?>>>, !fir.ref<!fir.box<!fir.heap<!fir.array<?x!fir.char<1,?>>>>> 149