xref: /llvm-project/flang/test/HLFIR/assign.fir (revision c4204c0b29a6721267b1bcbaeedd7b1118e42396)
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