1 ! RUN: bbc -emit-fir --polymorphic-type -I nowhere %s -o - | FileCheck %s
3 ! Test allocatable return.
4 ! Allocatable arrays must have default runtime lbounds after the return.
6 function test_alloc_return_scalar
7 real, allocatable
:: test_alloc_return_scalar
8 allocate(test_alloc_return_scalar
)
9 end function test_alloc_return_scalar
10 ! CHECK-LABEL: func.func @_QPtest_alloc_return_scalar() -> !fir.box<!fir.heap<f32>> {
11 ! CHECK: %[[VAL_0:.*]] = fir.alloca !fir.box<!fir.heap<f32>> {bindc_name = "test_alloc_return_scalar", uniq_name = "_QFtest_alloc_return_scalarEtest_alloc_return_scalar"}
12 ! CHECK: %[[VAL_5:.*]] = fir.load %[[VAL_0]] : !fir.ref<!fir.box<!fir.heap<f32>>>
13 ! CHECK: return %[[VAL_5]] : !fir.box<!fir.heap<f32>>
16 function test_alloc_return_array
17 real, allocatable
:: test_alloc_return_array(:)
18 allocate(test_alloc_return_array(7:8))
19 end function test_alloc_return_array
20 ! CHECK-LABEL: func.func @_QPtest_alloc_return_array() -> !fir.box<!fir.heap<!fir.array<?xf32>>> {
21 ! CHECK: %[[VAL_0:.*]] = fir.alloca !fir.box<!fir.heap<!fir.array<?xf32>>> {bindc_name = "test_alloc_return_array", uniq_name = "_QFtest_alloc_return_arrayEtest_alloc_return_array"}
22 ! CHECK: %[[VAL_18:.*]] = fir.load %[[VAL_0]] : !fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>>
23 ! CHECK: %[[VAL_19:.*]] = arith.constant 1 : index
24 ! CHECK: %[[VAL_20:.*]] = fir.shift %[[VAL_19]] : (index) -> !fir.shift<1>
25 ! CHECK: %[[VAL_21:.*]] = fir.rebox %[[VAL_18]](%[[VAL_20]]) : (!fir.box<!fir.heap<!fir.array<?xf32>>>, !fir.shift<1>) -> !fir.box<!fir.heap<!fir.array<?xf32>>>
26 ! CHECK: return %[[VAL_21]] : !fir.box<!fir.heap<!fir.array<?xf32>>>
29 function test_alloc_return_char_scalar
30 character(3), allocatable
:: test_alloc_return_char_scalar
31 allocate(test_alloc_return_char_scalar
)
32 end function test_alloc_return_char_scalar
33 ! CHECK-LABEL: func.func @_QPtest_alloc_return_char_scalar() -> !fir.box<!fir.heap<!fir.char<1,3>>> {
34 ! CHECK: %[[VAL_0:.*]] = fir.alloca !fir.box<!fir.heap<!fir.char<1,3>>> {bindc_name = "test_alloc_return_char_scalar", uniq_name = "_QFtest_alloc_return_char_scalarEtest_alloc_return_char_scalar"}
35 ! CHECK: %[[VAL_5:.*]] = fir.load %[[VAL_0]] : !fir.ref<!fir.box<!fir.heap<!fir.char<1,3>>>>
36 ! CHECK: return %[[VAL_5]] : !fir.box<!fir.heap<!fir.char<1,3>>>
39 function test_alloc_return_char_array
40 character(3), allocatable
:: test_alloc_return_char_array(:)
41 allocate(test_alloc_return_char_array(7:8))
42 end function test_alloc_return_char_array
43 ! CHECK-LABEL: func.func @_QPtest_alloc_return_char_array() -> !fir.box<!fir.heap<!fir.array<?x!fir.char<1,3>>>> {
44 ! CHECK: %[[VAL_0:.*]] = fir.alloca !fir.box<!fir.heap<!fir.array<?x!fir.char<1,3>>>> {bindc_name = "test_alloc_return_char_array", uniq_name = "_QFtest_alloc_return_char_arrayEtest_alloc_return_char_array"}
45 ! CHECK: %[[VAL_18:.*]] = fir.load %[[VAL_0]] : !fir.ref<!fir.box<!fir.heap<!fir.array<?x!fir.char<1,3>>>>>
46 ! CHECK: %[[VAL_19:.*]] = arith.constant 1 : index
47 ! CHECK: %[[VAL_20:.*]] = fir.shift %[[VAL_19]] : (index) -> !fir.shift<1>
48 ! CHECK: %[[VAL_21:.*]] = fir.rebox %[[VAL_18]](%[[VAL_20]]) : (!fir.box<!fir.heap<!fir.array<?x!fir.char<1,3>>>>, !fir.shift<1>) -> !fir.box<!fir.heap<!fir.array<?x!fir.char<1,3>>>>
49 ! CHECK: return %[[VAL_21]] : !fir.box<!fir.heap<!fir.array<?x!fir.char<1,3>>>>
52 function test_alloc_return_poly_scalar
55 class(*), allocatable
:: test_alloc_return_poly_scalar
56 allocate(t
:: test_alloc_return_poly_scalar
)
57 end function test_alloc_return_poly_scalar
58 ! CHECK-LABEL: func.func @_QPtest_alloc_return_poly_scalar() -> !fir.class<!fir.heap<none>> {
59 ! CHECK: %[[VAL_0:.*]] = fir.alloca !fir.class<!fir.heap<none>> {bindc_name = "test_alloc_return_poly_scalar", uniq_name = "_QFtest_alloc_return_poly_scalarEtest_alloc_return_poly_scalar"}
60 ! CHECK: %[[VAL_16:.*]] = fir.load %[[VAL_0]] : !fir.ref<!fir.class<!fir.heap<none>>>
61 ! CHECK: return %[[VAL_16]] : !fir.class<!fir.heap<none>>
64 function test_alloc_return_poly_array
67 class(*), allocatable
:: test_alloc_return_poly_array(:)
68 allocate(t
:: test_alloc_return_poly_array(7:8))
69 end function test_alloc_return_poly_array
70 ! CHECK-LABEL: func.func @_QPtest_alloc_return_poly_array() -> !fir.class<!fir.heap<!fir.array<?xnone>>> {
71 ! CHECK: %[[VAL_0:.*]] = fir.alloca !fir.class<!fir.heap<!fir.array<?xnone>>> {bindc_name = "test_alloc_return_poly_array", uniq_name = "_QFtest_alloc_return_poly_arrayEtest_alloc_return_poly_array"}
72 ! CHECK: %[[VAL_25:.*]] = fir.load %[[VAL_0]] : !fir.ref<!fir.class<!fir.heap<!fir.array<?xnone>>>>
73 ! CHECK: %[[VAL_26:.*]] = arith.constant 1 : index
74 ! CHECK: %[[VAL_27:.*]] = fir.shift %[[VAL_26]] : (index) -> !fir.shift<1>
75 ! CHECK: %[[VAL_28:.*]] = fir.rebox %[[VAL_25]](%[[VAL_27]]) : (!fir.class<!fir.heap<!fir.array<?xnone>>>, !fir.shift<1>) -> !fir.class<!fir.heap<!fir.array<?xnone>>>
76 ! CHECK: return %[[VAL_28]] : !fir.class<!fir.heap<!fir.array<?xnone>>>