xref: /llvm-project/flang/test/Lower/entry-statement.f90 (revision c4204c0b29a6721267b1bcbaeedd7b1118e42396)
1! RUN: bbc -emit-fir -hlfir=false -o - %s | FileCheck %s
2
3
4! CHECK-LABEL: func @_QPcompare1(
5! CHECK-SAME:  %{{.*}}: !fir.ref<!fir.logical<4>>{{.*}}, %{{.*}}: !fir.boxchar<1>{{.*}}, %{{.*}}: !fir.boxchar<1>{{.*}}) {
6subroutine compare1(x, c1, c2)
7  character(*) c1, c2, d1, d2
8  logical x, y
9  x = c1 < c2
10  return
11
12! CHECK-LABEL: func @_QPcompare2(
13! CHECK-SAME: %{{.*}}: !fir.ref<!fir.logical<4>>{{.*}}, %{{.*}}: !fir.boxchar<1>{{.*}}, %{{.*}}: !fir.boxchar<1>{{.*}}) {
14entry compare2(y, d2, d1)
15  y = d1 < d2
16end
17
18program entries
19  character c(3)
20  character(10) hh, qq, m
21  character(len=4) s1, s2
22  integer mm, x(3), y(5)
23  logical r
24  complex xx(3)
25  character(5), external :: f1, f2, f3
26
27  interface
28    subroutine ashapec(asc)
29      character asc(:)
30    end subroutine
31    subroutine ashapei(asi)
32      integer asi(:)
33    end subroutine
34    subroutine ashapex(asx)
35      complex asx(:)
36    end subroutine
37  end interface
38
39  s1 = 'a111'
40  s2 = 'a222'
41  call compare1(r, s1, s2); print*, r
42  call compare2(r, s1, s2); print*, r
43  call ss(mm);     print*, mm
44  call e1(mm, 17); print*, mm
45  call e2(17, mm); print*, mm
46  call e3(mm);     print*, mm
47  print*, jj(11)
48  print*, rr(22)
49  m = 'abcd efgh'
50  print*, hh(m)
51  print*, qq(m)
52  call dd1
53  call dd2
54  call dd3(6)
556 continue
56  x = 5
57  y = 7
58  call level3a(x, y, 3)
59  call level3b(x, y, 3)
60  call ashapec(c); print*, c
61  call ashapei(x); print*, x
62  call ashapex(xx); print*, xx
63  print *, f1(1)
64  print *, f2(2)
65  print *, f3()
66end
67
68! CHECK-LABEL: func @_QPss(
69! CHECK-SAME: %{{.*}}: !fir.ref<i32>{{.*}}) {
70subroutine ss(n1)
71  ! CHECK: fir.alloca i32 {{{.*}}uniq_name = "{{.*}}Enx"}
72  ! CHECK: fir.alloca i32 {{{.*}}uniq_name = "{{.*}}Eny"}
73  integer n17, n2
74  nx = 100
75  n1 = nx + 10
76  return
77
78! CHECK-LABEL: func @_QPe1(
79! CHECK-SAME: %{{.*}}: !fir.ref<i32>{{.*}}, %{{.*}}: !fir.ref<i32>{{.*}}) {
80entry e1(n2, n17)
81  ! CHECK: fir.alloca i32 {{{.*}}uniq_name = "{{.*}}Enx"}
82  ! CHECK: fir.alloca i32 {{{.*}}uniq_name = "{{.*}}Eny"}
83  ny = 200
84  n2 = ny + 20
85  return
86
87  ! CHECK-LABEL: func @_QPe2(
88  ! CHECK-SAME: %{{.*}}: !fir.ref<i32>{{.*}}, %{{.*}}: !fir.ref<i32>{{.*}}) {
89entry e2(n3, n1)
90  ! CHECK: fir.alloca i32 {{{.*}}uniq_name = "{{.*}}Enx"}
91  ! CHECK: fir.alloca i32 {{{.*}}uniq_name = "{{.*}}Eny"}
92
93! CHECK-LABEL: func @_QPe3(
94! CHECK-SAME: %{{.*}}: !fir.ref<i32>{{.*}}) {
95entry e3(n1)
96  ! CHECK: fir.alloca i32 {{{.*}}uniq_name = "{{.*}}Enx"}
97  ! CHECK: fir.alloca i32 {{{.*}}uniq_name = "{{.*}}Eny"}
98  n1 = 30
99end
100
101! CHECK-LABEL: func @_QPjj(
102! CHECK-SAME: %{{.*}}: !fir.ref<i32>{{.*}}) -> i32
103function jj(n1)
104  ! CHECK: fir.alloca i32 {{{.*}}uniq_name = "{{.*}}Ejj"}
105  jj = 100
106  jj = jj + n1
107  return
108
109  ! CHECK-LABEL: func @_QPrr(
110  ! CHECK-SAME: %{{.*}}: !fir.ref<i32>{{.*}}) -> f32
111entry rr(n2)
112  ! CHECK: fir.alloca i32 {{{.*}}uniq_name = "{{.*}}Ejj"}
113  rr = 200.0
114  rr = rr + n2
115end
116
117! CHECK-LABEL: func @_QPhh(
118! CHECK-SAME: %{{.*}}: !fir.ref<!fir.char<1,10>>{{.*}}, %{{.*}}: index{{.*}}, %{{.*}}: !fir.boxchar<1>{{.*}}) -> !fir.boxchar<1>
119function hh(c1)
120  character(10) c1, hh, qq
121  hh = c1
122  return
123  ! CHECK-LABEL: func @_QPqq(
124  ! CHECK-SAME: %{{.*}}: !fir.ref<!fir.char<1,10>>{{.*}}, %{{.*}}: index{{.*}}, %{{.*}}: !fir.boxchar<1>{{.*}}) -> !fir.boxchar<1>
125entry qq(c1)
126  qq = c1
127end
128
129! CHECK-LABEL: func @_QPchar_array()
130function char_array()
131  character(10), c(5)
132! CHECK-LABEL: func @_QPchar_array_entry(
133! CHECK-SAME: %{{.*}}: !fir.boxchar<1>{{.*}}) -> f32 {
134entry char_array_entry(c)
135end
136
137! CHECK-LABEL: func @_QPdd1()
138subroutine dd1
139  ! CHECK: %[[kk:[0-9]*]] = fir.alloca i32 {bindc_name = "kk", uniq_name = "_QFdd1Ekk"}
140  ! CHECK: br ^bb1
141  ! CHECK: ^bb1:  // pred: ^bb0
142  ! CHECK: %[[ten:.*]] = arith.constant 10 : i32
143  ! CHECK: fir.store %[[ten:.*]] to %[[kk]] : !fir.ref<i32>
144  ! CHECK: br ^bb2
145  ! CHECK: ^bb2:  // pred: ^bb1
146  ! CHECK: %[[twenty:.*]] = arith.constant 20 : i32
147  ! CHECK: fir.store %[[twenty:.*]] to %[[kk]] : !fir.ref<i32>
148  ! CHECK: br ^bb3
149  ! CHECK: ^bb3:  // pred: ^bb2
150  ! CHECK: return
151  kk = 10
152
153  ! CHECK-LABEL: func @_QPdd2()
154  ! CHECK: %[[kk:[0-9]*]] = fir.alloca i32 {bindc_name = "kk", uniq_name = "_QFdd1Ekk"}
155  ! CHECK: br ^bb1
156  ! CHECK: ^bb1:  // pred: ^bb0
157  ! CHECK: %[[twenty:.*]] = arith.constant 20 : i32
158  ! CHECK: fir.store %[[twenty:.*]] to %[[kk]] : !fir.ref<i32>
159  ! CHECK: br ^bb2
160  ! CHECK: ^bb2:  // pred: ^bb1
161  ! CHECK: return
162  entry dd2
163  kk = 20
164  return
165
166  ! CHECK-LABEL: func @_QPdd3
167  ! CHECK: %[[dd3:[0-9]*]] = fir.alloca index {bindc_name = "dd3"}
168  ! CHECK: %[[kk:[0-9]*]] = fir.alloca i32 {bindc_name = "kk", uniq_name = "_QFdd1Ekk"}
169  ! CHECK: %[[zero:.*]] = arith.constant 0 : index
170  ! CHECK: fir.store %[[zero:.*]] to %[[dd3]] : !fir.ref<index>
171  ! CHECK: br ^bb1
172  ! CHECK: ^bb1:  // pred: ^bb0
173  ! CHECK: %[[thirty:.*]] = arith.constant 30 : i32
174  ! CHECK: fir.store %[[thirty:.*]] to %[[kk:[0-9]*]] : !fir.ref<i32>
175  ! CHECK: br ^bb2
176  ! CHECK: ^bb2:  // pred: ^bb1
177  ! CHECK: %[[altret:[0-9]*]] = fir.load %[[dd3]] : !fir.ref<index>
178  ! CHECK: return %[[altret:[0-9]*]] : index
179  entry dd3(*)
180  kk = 30
181end
182
183! CHECK-LABEL: func @_QPashapec(
184subroutine ashapec(asc)
185  ! CHECK: %[[asx:[0-9]*]] = fir.alloca !fir.box<!fir.heap<!fir.array<?xcomplex<f32>>>>
186  ! CHECK: %[[asi:[0-9]*]] = fir.alloca !fir.box<!fir.heap<!fir.array<?xi32>>>
187  ! CHECK: %[[zeroi:[0-9]*]] = fir.zero_bits !fir.heap<!fir.array<?xi32>>
188  ! CHECK: %[[shapei:[0-9]*]] = fir.shape %c0{{.*}} : (index) -> !fir.shape<1>
189  ! CHECK: %[[boxi:[0-9]*]] = fir.embox %[[zeroi]](%[[shapei]]) : (!fir.heap<!fir.array<?xi32>>, !fir.shape<1>) -> !fir.box<!fir.heap<!fir.array<?xi32>>>
190  ! CHECK: fir.store %[[boxi]] to %[[asi]] : !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>
191  ! CHECK: %[[zerox:[0-9]*]] = fir.zero_bits !fir.heap<!fir.array<?xcomplex<f32>>>
192  ! CHECK: %[[shapex:[0-9]*]] = fir.shape %c0{{.*}} : (index) -> !fir.shape<1>
193  ! CHECK: %[[boxx:[0-9].*]] = fir.embox %[[zerox]](%[[shapex]]) : (!fir.heap<!fir.array<?xcomplex<f32>>>, !fir.shape<1>) -> !fir.box<!fir.heap<!fir.array<?xcomplex<f32>>>>
194  ! CHECK: fir.store %[[boxx]] to %[[asx]] : !fir.ref<!fir.box<!fir.heap<!fir.array<?xcomplex<f32>>>>>
195  character asc(:)
196  integer asi(:)
197  complex asx(:)
198  asc = '?'
199  return
200! CHECK-LABEL: func @_QPashapei(
201entry ashapei(asi)
202  ! CHECK: %[[asx:[0-9]*]] = fir.alloca !fir.box<!fir.heap<!fir.array<?xcomplex<f32>>>>
203  ! CHECK: %[[asc:[0-9]*]] = fir.alloca !fir.box<!fir.heap<!fir.array<?x!fir.char<1>>>>
204  ! CHECK: %[[zeroc:[0-9]*]] = fir.zero_bits !fir.heap<!fir.array<?x!fir.char<1>>>
205  ! CHECK: %[[shapec:[0-9]*]] = fir.shape %c0{{.*}} : (index) -> !fir.shape<1>
206  ! CHECK: %[[boxc:[0-9]*]] = fir.embox %[[zeroc]](%[[shapec]]) : (!fir.heap<!fir.array<?x!fir.char<1>>>, !fir.shape<1>) -> !fir.box<!fir.heap<!fir.array<?x!fir.char<1>>>>
207  ! CHECK: fir.store %[[boxc]] to %[[asc]] : !fir.ref<!fir.box<!fir.heap<!fir.array<?x!fir.char<1>>>>>
208  ! CHECK: %[[zerox:[0-9]*]] = fir.zero_bits !fir.heap<!fir.array<?xcomplex<f32>>>
209  ! CHECK: %[[shapex:[0-9]*]] = fir.shape %c0{{.*}} : (index) -> !fir.shape<1>
210  ! CHECK: %[[boxx:[0-9].*]] = fir.embox %[[zerox]](%[[shapex]]) : (!fir.heap<!fir.array<?xcomplex<f32>>>, !fir.shape<1>) -> !fir.box<!fir.heap<!fir.array<?xcomplex<f32>>>>
211  ! CHECK: fir.store %[[boxx]] to %[[asx]] : !fir.ref<!fir.box<!fir.heap<!fir.array<?xcomplex<f32>>>>>
212  asi = 3
213  return
214! CHECK-LABEL: func @_QPashapex(
215entry ashapex(asx)
216  ! CHECK: %[[asi:[0-9]*]] = fir.alloca !fir.box<!fir.heap<!fir.array<?xi32>>>
217  ! CHECK: %[[asc:[0-9]*]] = fir.alloca !fir.box<!fir.heap<!fir.array<?x!fir.char<1>>>>
218  ! CHECK: %[[zeroc:[0-9]*]] = fir.zero_bits !fir.heap<!fir.array<?x!fir.char<1>>>
219  ! CHECK: %[[shapec:[0-9]*]] = fir.shape %c0{{.*}} : (index) -> !fir.shape<1>
220  ! CHECK: %[[boxc:[0-9]*]] = fir.embox %[[zeroc]](%[[shapec]]) : (!fir.heap<!fir.array<?x!fir.char<1>>>, !fir.shape<1>) -> !fir.box<!fir.heap<!fir.array<?x!fir.char<1>>>>
221  ! CHECK: fir.store %[[boxc]] to %[[asc]] : !fir.ref<!fir.box<!fir.heap<!fir.array<?x!fir.char<1>>>>>
222  ! CHECK: %[[zeroi:[0-9]*]] = fir.zero_bits !fir.heap<!fir.array<?xi32>>
223  ! CHECK: %[[shapei:[0-9]*]] = fir.shape %c0{{.*}} : (index) -> !fir.shape<1>
224  ! CHECK: %[[boxi:[0-9].*]] = fir.embox %[[zeroi]](%[[shapei]]) : (!fir.heap<!fir.array<?xi32>>, !fir.shape<1>) -> !fir.box<!fir.heap<!fir.array<?xi32>>>
225  ! CHECK: fir.store %[[boxi]] to %[[asi]] : !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>
226  asx = (2.0,-2.0)
227end
228
229! CHECK-LABEL: func @_QPlevel3a(
230subroutine level3a(a, b, m)
231  ! CHECK: fir.alloca !fir.box<!fir.heap<!fir.array<?xi32>>>
232  ! CHECK: fir.alloca !fir.box<!fir.heap<!fir.array<?xi32>>>
233  ! CHECK: fir.alloca i32 {bindc_name = "n", uniq_name = "_QFlevel3aEn"}
234  integer :: a(m), b(a(m)), m
235  integer :: x(n), y(x(n)), n
2361 print*, m
237  print*, a
238  print*, b
239  if (m == 3) return
240! CHECK-LABEL: func @_QPlevel3b(
241entry level3b(x, y, n)
242  ! CHECK: fir.alloca !fir.box<!fir.heap<!fir.array<?xi32>>>
243  ! CHECK: fir.alloca !fir.box<!fir.heap<!fir.array<?xi32>>>
244  ! CHECK: fir.alloca i32 {bindc_name = "m", uniq_name = "_QFlevel3aEm"}
245  print*, n
246  print*, x
247  print*, y
248  if (n /= 3) goto 1
249end
250
251! CHECK-LABEL: @_QPf1
252! CHECK-SAME: %[[V_0:.*]]: !fir.ref<!fir.char<1,5>>
253function f1(n1) result(res1)
254  ! CHECK:   %[[V_1:[0-9]+]] = fir.alloca i32 {bindc_name = "n2", uniq_name = "_QFf1En2"}
255  ! CHECK:   %[[V_2:[0-9]+]] = fir.alloca tuple<!fir.boxchar<1>, !fir.boxchar<1>>
256  ! CHECK:   %[[V_3:[0-9]+]] = fir.coordinate_of %[[V_2]], %c0{{.*}}_i32 : (!fir.ref<tuple<!fir.boxchar<1>, !fir.boxchar<1>>>, i32) -> !fir.ref<!fir.boxchar<1>>
257  ! CHECK:   %[[V_4:[0-9]+]] = fir.emboxchar %[[V_0]], %c5{{.*}} : (!fir.ref<!fir.char<1,5>>, index) -> !fir.boxchar<1>
258  ! CHECK:   fir.store %[[V_4]] to %[[V_3]] : !fir.ref<!fir.boxchar<1>>
259  ! CHECK:   %[[V_5:[0-9]+]] = fir.coordinate_of %[[V_2]], %c1{{.*}}_i32 : (!fir.ref<tuple<!fir.boxchar<1>, !fir.boxchar<1>>>, i32) -> !fir.ref<!fir.boxchar<1>>
260  ! CHECK:   %[[V_6:[0-9]+]] = fir.emboxchar %[[V_0]], %c5{{.*}} : (!fir.ref<!fir.char<1,5>>, index) -> !fir.boxchar<1>
261  ! CHECK:   fir.store %[[V_6]] to %[[V_5]] : !fir.ref<!fir.boxchar<1>>
262  ! CHECK:   br ^bb1
263  ! CHECK: ^bb1:  // pred: ^bb0
264  ! CHECK:   %[[V_7:[0-9]+]] = fir.address_of(@_QQclX6120612061) : !fir.ref<!fir.char<1,5>>
265  ! CHECK:   %[[V_10:[0-9]+]] = fir.convert %c5{{.*}} : (index) -> i64
266  ! CHECK:   %[[V_11:[0-9]+]] = arith.muli %c1{{.*}}_i64, %[[V_10]] : i64
267  ! CHECK:   %[[V_12:[0-9]+]] = fir.convert %[[V_0]] : (!fir.ref<!fir.char<1,5>>) -> !fir.ref<i8>
268  ! CHECK:   %[[V_13:[0-9]+]] = fir.convert %[[V_7]] : (!fir.ref<!fir.char<1,5>>) -> !fir.ref<i8>
269  ! CHECK:   fir.call @llvm.memmove.p0.p0.i64(%[[V_12]], %[[V_13]], %[[V_11]], %false{{.*}}) {{.*}}: (!fir.ref<i8>, !fir.ref<i8>, i64, i1) -> ()
270  ! CHECK:   %[[V_17:[0-9]+]] = fir.load %arg2 : !fir.ref<i32>
271  ! CHECK:   %[[V_18:[0-9]+]] = arith.cmpi eq, %[[V_17]], %c1{{.*}} : i32
272  ! CHECK:   cond_br %[[V_18]], ^bb2, ^bb3
273  ! CHECK: ^bb2:  // pred: ^bb1
274  ! CHECK:   br ^bb6
275  ! CHECK: ^bb3:  // pred: ^bb1
276  ! CHECK:   fir.call @_QFf1Ps2(%[[V_2]]) {{.*}}: (!fir.ref<tuple<!fir.boxchar<1>, !fir.boxchar<1>>>) -> ()
277  ! CHECK:   %[[V_19:[0-9]+]] = fir.load %[[V_1]] : !fir.ref<i32>
278  ! CHECK:   %[[V_20:[0-9]+]] = arith.cmpi eq, %[[V_19]], %c2{{.*}}_i32 : i32
279  ! CHECK:   cond_br %[[V_20]], ^bb4, ^bb5
280  ! CHECK: ^bb4:  // pred: ^bb3
281  ! CHECK:   cf.br ^bb6
282  ! CHECK: ^bb5:  // pred: ^bb3
283  ! CHECK:   %[[V_21:[0-9]+]] = fir.address_of(@_QQclX4320432043) : !fir.ref<!fir.char<1,5>>
284  ! CHECK:   %[[V_24:[0-9]+]] = fir.convert %c5{{.*}} : (index) -> i64
285  ! CHECK:   %[[V_25:[0-9]+]] = arith.muli %c1{{.*}}, %[[V_24]] : i64
286  ! CHECK:   %[[V_26:[0-9]+]] = fir.convert %[[V_0]] : (!fir.ref<!fir.char<1,5>>) -> !fir.ref<i8>
287  ! CHECK:   %[[V_27:[0-9]+]] = fir.convert %[[V_21]] : (!fir.ref<!fir.char<1,5>>) -> !fir.ref<i8>
288  ! CHECK:   fir.call @llvm.memmove.p0.p0.i64(%[[V_26]], %[[V_27]], %[[V_25]], %false{{.*}}) {{.*}}: (!fir.ref<i8>, !fir.ref<i8>, i64, i1) -> ()
289  ! CHECK:   fir.call @_QFf1Ps3(%[[V_2]]) {{.*}}: (!fir.ref<tuple<!fir.boxchar<1>, !fir.boxchar<1>>>) -> ()
290  ! CHECK:   br ^bb6
291  ! CHECK: ^bb6:  //  3 preds: ^bb2, ^bb4, ^bb5
292  ! CHECK:   %[[V_31:[0-9]+]] = fir.emboxchar %[[V_0]], %c5{{.*}} : (!fir.ref<!fir.char<1,5>>, index) -> !fir.boxchar<1>
293  ! CHECK:   return %[[V_31]] : !fir.boxchar<1>
294  ! CHECK: }
295  character(5) res1, f2, f3
296  res1 = 'a a a'
297  if (n1 == 1) return
298
299! CHECK-LABEL: @_QPf2
300! CHECK-SAME: %[[V_0:.*]]: !fir.ref<!fir.char<1,5>>
301entry f2(n2)
302  ! CHECK:   %[[V_1:[0-9]+]] = fir.alloca i32 {bindc_name = "n1", uniq_name = "_QFf1En1"}
303  ! CHECK:   %[[V_2:[0-9]+]] = fir.alloca tuple<!fir.boxchar<1>, !fir.boxchar<1>>
304  ! CHECK:   %[[V_3:[0-9]+]] = fir.coordinate_of %[[V_2]], %c0{{.*}}_i32 : (!fir.ref<tuple<!fir.boxchar<1>, !fir.boxchar<1>>>, i32) -> !fir.ref<!fir.boxchar<1>>
305  ! CHECK:   %[[V_4:[0-9]+]] = fir.emboxchar %[[V_0]], %c5{{.*}} : (!fir.ref<!fir.char<1,5>>, index) -> !fir.boxchar<1>
306  ! CHECK:   fir.store %[[V_4]] to %[[V_3]] : !fir.ref<!fir.boxchar<1>>
307  ! CHECK:   %[[V_5:[0-9]+]] = fir.coordinate_of %[[V_2]], %c1{{.*}}_i32 : (!fir.ref<tuple<!fir.boxchar<1>, !fir.boxchar<1>>>, i32) -> !fir.ref<!fir.boxchar<1>>
308  ! CHECK:   %[[V_6:[0-9]+]] = fir.emboxchar %[[V_0]], %c5{{.*}} : (!fir.ref<!fir.char<1,5>>, index) -> !fir.boxchar<1>
309  ! CHECK:   fir.store %[[V_6]] to %[[V_5]] : !fir.ref<!fir.boxchar<1>>
310  ! CHECK:   br ^bb1
311  ! CHECK: ^bb1:  // pred: ^bb0
312  ! CHECK:   fir.call @_QFf1Ps2(%[[V_2]]) {{.*}}: (!fir.ref<tuple<!fir.boxchar<1>, !fir.boxchar<1>>>) -> ()
313  ! CHECK:   %[[V_7:[0-9]+]] = fir.load %arg2 : !fir.ref<i32>
314  ! CHECK:   %[[V_8:[0-9]+]] = arith.cmpi eq, %[[V_7]], %c2{{.*}}_i32 : i32
315  ! CHECK:   cond_br %[[V_8]], ^bb2, ^bb3
316  ! CHECK: ^bb2:  // pred: ^bb1
317  ! CHECK:   br ^bb4
318  ! CHECK: ^bb3:  // pred: ^bb1
319  ! CHECK:   %[[V_9:[0-9]+]] = fir.address_of(@_QQclX4320432043) : !fir.ref<!fir.char<1,5>>
320  ! CHECK:   %[[V_12:[0-9]+]] = fir.convert %c5{{.*}} : (index) -> i64
321  ! CHECK:   %[[V_13:[0-9]+]] = arith.muli %c1{{.*}}, %[[V_12]] : i64
322  ! CHECK:   %[[V_14:[0-9]+]] = fir.convert %[[V_0]] : (!fir.ref<!fir.char<1,5>>) -> !fir.ref<i8>
323  ! CHECK:   %[[V_15:[0-9]+]] = fir.convert %[[V_9]] : (!fir.ref<!fir.char<1,5>>) -> !fir.ref<i8>
324  ! CHECK:   fir.call @llvm.memmove.p0.p0.i64(%[[V_14]], %[[V_15]], %[[V_13]], %false{{.*}}) {{.*}}: (!fir.ref<i8>, !fir.ref<i8>, i64, i1) -> ()
325  ! CHECK:   fir.call @_QFf1Ps3(%[[V_2]]) {{.*}}: (!fir.ref<tuple<!fir.boxchar<1>, !fir.boxchar<1>>>) -> ()
326  ! CHECK:   br ^bb4
327  ! CHECK: ^bb4:  // 2 preds: ^bb2, ^bb3
328  ! CHECK:   %[[V_19:[0-9]+]] = fir.emboxchar %[[V_0]], %c5{{.*}} : (!fir.ref<!fir.char<1,5>>, index) -> !fir.boxchar<1>
329  ! CHECK:   return %[[V_19]] : !fir.boxchar<1>
330  ! CHECK: }
331  call s2
332  if (n2 == 2) return
333
334! CHECK-LABEL: @_QPf3
335! CHECK-SAME: %[[V_0:.*]]: !fir.ref<!fir.char<1,5>>
336entry f3
337  ! CHECK:   %[[V_1:[0-9]+]] = fir.alloca i32 {bindc_name = "n1", uniq_name = "_QFf1En1"}
338  ! CHECK:   %[[V_2:[0-9]+]] = fir.alloca i32 {bindc_name = "n2", uniq_name = "_QFf1En2"}
339  ! CHECK:   %[[V_3:[0-9]+]] = fir.alloca tuple<!fir.boxchar<1>, !fir.boxchar<1>>
340  ! CHECK:   %[[V_4:[0-9]+]] = fir.coordinate_of %[[V_3]], %c0{{.*}}_i32 : (!fir.ref<tuple<!fir.boxchar<1>, !fir.boxchar<1>>>, i32) -> !fir.ref<!fir.boxchar<1>>
341  ! CHECK:   %[[V_5:[0-9]+]] = fir.emboxchar %[[V_0]], %c5{{.*}} : (!fir.ref<!fir.char<1,5>>, index) -> !fir.boxchar<1>
342  ! CHECK:   fir.store %[[V_5]] to %[[V_4]] : !fir.ref<!fir.boxchar<1>>
343  ! CHECK:   %[[V_6:[0-9]+]] = fir.coordinate_of %[[V_3]], %c1{{.*}}_i32 : (!fir.ref<tuple<!fir.boxchar<1>, !fir.boxchar<1>>>, i32) -> !fir.ref<!fir.boxchar<1>>
344  ! CHECK:   %[[V_7:[0-9]+]] = fir.emboxchar %[[V_0]], %c5{{.*}} : (!fir.ref<!fir.char<1,5>>, index) -> !fir.boxchar<1>
345  ! CHECK:   fir.store %[[V_7]] to %[[V_6]] : !fir.ref<!fir.boxchar<1>>
346  ! CHECK:   br ^bb1
347  ! CHECK: ^bb1:  // pred: ^bb0
348  ! CHECK:   %[[V_8:[0-9]+]] = fir.address_of(@_QQclX4320432043) : !fir.ref<!fir.char<1,5>>
349  ! CHECK:   %[[V_11:[0-9]+]] = fir.convert %c5{{.*}} : (index) -> i64
350  ! CHECK:   %[[V_12:[0-9]+]] = arith.muli %c1{{.*}}_i64, %[[V_11]] : i64
351  ! CHECK:   %[[V_13:[0-9]+]] = fir.convert %[[V_0]] : (!fir.ref<!fir.char<1,5>>) -> !fir.ref<i8>
352  ! CHECK:   %[[V_14:[0-9]+]] = fir.convert %[[V_8]] : (!fir.ref<!fir.char<1,5>>) -> !fir.ref<i8>
353  ! CHECK:   fir.call @llvm.memmove.p0.p0.i64(%[[V_13]], %[[V_14]], %[[V_12]], %false{{.*}}) {{.*}}: (!fir.ref<i8>, !fir.ref<i8>, i64, i1) -> ()
354  ! CHECK:   fir.call @_QFf1Ps3(%[[V_3]]) {{.*}}: (!fir.ref<tuple<!fir.boxchar<1>, !fir.boxchar<1>>>) -> ()
355  ! CHECK:   br ^bb2
356  ! CHECK: ^bb2:  // pred: ^bb1
357  ! CHECK:   %[[V_18:[0-9]+]] = fir.emboxchar %[[V_0]], %c5{{.*}} : (!fir.ref<!fir.char<1,5>>, index) -> !fir.boxchar<1>
358  ! CHECK:   return %[[V_18]] : !fir.boxchar<1>
359  ! CHECK: }
360  f3 = "C C C"
361  call s3
362contains
363  ! CHECK-LABEL: @_QFf1Ps2
364  subroutine s2
365    ! CHECK:   %[[V_0:[0-9]+]] = fir.coordinate_of %arg0, %c0{{.*}}_i32 : (!fir.ref<tuple<!fir.boxchar<1>, !fir.boxchar<1>>>, i32) -> !fir.ref<!fir.boxchar<1>>
366    ! CHECK:   %[[V_1:[0-9]+]] = fir.load %[[V_0]] : !fir.ref<!fir.boxchar<1>>
367    ! CHECK:   %[[V_2:[0-9]+]]:2 = fir.unboxchar %[[V_1]] : (!fir.boxchar<1>) -> (!fir.ref<!fir.char<1,?>>, index)
368    ! CHECK:   %[[V_3:[0-9]+]] = fir.address_of(@_QQclX6220622062) : !fir.ref<!fir.char<1,5>>
369    ! CHECK:   %[[V_4:[0-9]+]] = arith.cmpi slt, %[[V_2]]#1, %c5{{.*}} : index
370    ! CHECK:   %[[V_5:[0-9]+]] = arith.select %[[V_4]], %[[V_2]]#1, %c5{{.*}} : index
371    ! CHECK:   %[[V_6:[0-9]+]] = fir.convert %[[V_5]] : (index) -> i64
372    ! CHECK:   %[[V_7:[0-9]+]] = arith.muli %c1{{.*}}_i64, %[[V_6]] : i64
373    ! CHECK:   %[[V_8:[0-9]+]] = fir.convert %[[V_2]]#0 : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<i8>
374    ! CHECK:   %[[V_9:[0-9]+]] = fir.convert %[[V_3]] : (!fir.ref<!fir.char<1,5>>) -> !fir.ref<i8>
375    ! CHECK:   fir.call @llvm.memmove.p0.p0.i64(%[[V_8]], %[[V_9]], %[[V_7]], %false{{.*}}) {{.*}}: (!fir.ref<i8>, !fir.ref<i8>, i64, i1) -> ()
376    ! CHECK:   %[[V_10:[0-9]+]] = arith.subi %[[V_2]]#1, %c1{{.*}} : index
377    ! CHECK:   %[[V_11:[0-9]+]] = fir.undefined !fir.char<1>
378    ! CHECK:   %[[V_12:[0-9]+]] = fir.insert_value %[[V_11]], %c32{{.*}}_i8, [0 : index] : (!fir.char<1>, i8) -> !fir.char<1>
379    ! CHECK:   fir.do_loop %arg1 = %[[V_5]] to %[[V_10]] step %c1{{.*}} {
380    ! CHECK:     %[[V_13:[0-9]+]] = fir.convert %[[V_2]]#0 : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<!fir.array<?x!fir.char<1>>>
381    ! CHECK:     %[[V_14:[0-9]+]] = fir.coordinate_of %[[V_13]], %arg1 : (!fir.ref<!fir.array<?x!fir.char<1>>>, index) -> !fir.ref<!fir.char<1>>
382    ! CHECK:     fir.store %[[V_12]] to %[[V_14]] : !fir.ref<!fir.char<1>>
383    ! CHECK:   }
384    ! CHECK:   return
385    ! CHECK: }
386    f2 = 'b b b'
387  end
388
389  ! CHECK-LABEL: @_QFf1Ps3
390  subroutine s3
391    ! CHECK:   %[[V_0:[0-9]+]] = fir.coordinate_of %arg0, %c1{{.*}}_i32 : (!fir.ref<tuple<!fir.boxchar<1>, !fir.boxchar<1>>>, i32) -> !fir.ref<!fir.boxchar<1>>
392    ! CHECK:   %[[V_1:[0-9]+]] = fir.load %[[V_0]] : !fir.ref<!fir.boxchar<1>>
393    ! CHECK:   %[[V_2:[0-9]+]]:2 = fir.unboxchar %[[V_1]] : (!fir.boxchar<1>) -> (!fir.ref<!fir.char<1,?>>, index)
394    ! CHECK:   %[[V_3:[0-9]+]] = fir.address_of(@_QQclX6320632063) : !fir.ref<!fir.char<1,5>>
395    ! CHECK:   %[[V_4:[0-9]+]] = arith.cmpi slt, %[[V_2]]#1, %c5{{.*}} : index
396    ! CHECK:   %[[V_5:[0-9]+]] = arith.select %[[V_4]], %[[V_2]]#1, %c5{{.*}} : index
397    ! CHECK:   %[[V_6:[0-9]+]] = fir.convert %[[V_5]] : (index) -> i64
398    ! CHECK:   %[[V_7:[0-9]+]] = arith.muli %c1{{.*}}_i64, %[[V_6]] : i64
399    ! CHECK:   %[[V_8:[0-9]+]] = fir.convert %[[V_2]]#0 : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<i8>
400    ! CHECK:   %[[V_9:[0-9]+]] = fir.convert %[[V_3]] : (!fir.ref<!fir.char<1,5>>) -> !fir.ref<i8>
401    ! CHECK:   fir.call @llvm.memmove.p0.p0.i64(%[[V_8]], %[[V_9]], %[[V_7]], %false{{.*}}) {{.*}}: (!fir.ref<i8>, !fir.ref<i8>, i64, i1) -> ()
402    ! CHECK:   %[[V_10:[0-9]+]] = arith.subi %[[V_2]]#1, %c1{{.*}} : index
403    ! CHECK:   %[[V_11:[0-9]+]] = fir.undefined !fir.char<1>
404    ! CHECK:   %[[V_12:[0-9]+]] = fir.insert_value %[[V_11]], %c32{{.*}}_i8, [0 : index] : (!fir.char<1>, i8) -> !fir.char<1>
405    ! CHECK:   fir.do_loop %arg1 = %[[V_5]] to %[[V_10]] step %c1{{.*}} {
406    ! CHECK:     %[[V_13:[0-9]+]] = fir.convert %[[V_2]]#0 : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<!fir.array<?x!fir.char<1>>>
407    ! CHECK:     %[[V_14:[0-9]+]] = fir.coordinate_of %[[V_13]], %arg1 : (!fir.ref<!fir.array<?x!fir.char<1>>>, index) -> !fir.ref<!fir.char<1>>
408    ! CHECK:     fir.store %[[V_12]] to %[[V_14]] : !fir.ref<!fir.char<1>>
409    ! CHECK:   }
410    ! CHECK:   return
411    ! CHECK: }
412    f3 = 'c c c'
413  end
414end
415
416! CHECK-LABEL: func @_QPassumed_size() {
417subroutine assumed_size()
418  real :: x(*)
419! CHECK:  %[[VAL_0:.*]] = fir.alloca !fir.box<!fir.heap<!fir.array<?xf32>>>
420! CHECK:  %[[VAL_1:.*]] = fir.zero_bits !fir.heap<!fir.array<?xf32>>
421! CHECK:  %[[VAL_2:.*]] = arith.constant 0 : index
422! CHECK:  %[[VAL_3:.*]] = fir.shape %[[VAL_2]] : (index) -> !fir.shape<1>
423! CHECK:  %[[VAL_4:.*]] = fir.embox %[[VAL_1]](%[[VAL_3]]) : (!fir.heap<!fir.array<?xf32>>, !fir.shape<1>) -> !fir.box<!fir.heap<!fir.array<?xf32>>>
424! CHECK:  fir.store %[[VAL_4]] to %[[VAL_0]] : !fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>>
425! CHECK:  br ^bb1
426! CHECK:  ^bb1:
427! CHECK:  return
428! CHECK:  }
429
430! CHECK-LABEL: func @_QPentry_with_assumed_size(
431  entry entry_with_assumed_size(x)
432! CHECK-SAME:  %[[VAL_0:.*]]: !fir.ref<!fir.array<?xf32>> {fir.bindc_name = "x"}) {
433! CHECK:  br ^bb1
434! CHECK:  ^bb1:
435! CHECK:  return
436! CHECK:  }
437end subroutine
438