xref: /llvm-project/flang/test/Lower/HLFIR/convert-variable.f90 (revision 1710c8cf0f8def4984893e9dd646579de5528d95)
1ca0a0bf9SJean Perier! Test lowering of variables to fir.declare
281ea6b7eSTom Eccles! RUN: bbc -emit-hlfir %s -o - | FileCheck %s
3ca0a0bf9SJean Perier
4ca0a0bf9SJean Periersubroutine scalar_numeric(x)
5ca0a0bf9SJean Perier  integer :: x
6ca0a0bf9SJean Perierend subroutine
7ca0a0bf9SJean Perier! CHECK-LABEL: func.func @_QPscalar_numeric(
8ca0a0bf9SJean Perier! CHECK-SAME:    %[[VAL_0:.*]]: !fir.ref<i32>
9*1710c8cfSSlava Zakharin! CHECK:  %[[VAL_1:.*]] = hlfir.declare %[[VAL_0]] dummy_scope %{{[0-9]+}} {uniq_name = "_QFscalar_numericEx"} : (!fir.ref<i32>, !fir.dscope) -> (!fir.ref<i32>, !fir.ref<i32>)
10ca0a0bf9SJean Perier
11ca0a0bf9SJean Periersubroutine scalar_character(c)
12ca0a0bf9SJean Perier  character(*) :: c
13ca0a0bf9SJean Perierend subroutine
14ca0a0bf9SJean Perier! CHECK-LABEL: func.func @_QPscalar_character(
15ca0a0bf9SJean Perier! CHECK-SAME:    %[[VAL_0:.*]]: !fir.boxchar<1>
16ca0a0bf9SJean Perier! CHECK:  %[[VAL_1:.*]]:2 = fir.unboxchar %[[VAL_0]] : (!fir.boxchar<1>) -> (!fir.ref<!fir.char<1,?>>, index)
17*1710c8cfSSlava Zakharin! CHECK:  %[[VAL_2:.*]] = hlfir.declare %[[VAL_1]]#0 typeparams %[[VAL_1]]#1 dummy_scope %{{[0-9]+}} {uniq_name = "_QFscalar_characterEc"} : (!fir.ref<!fir.char<1,?>>, index, !fir.dscope) -> (!fir.boxchar<1>, !fir.ref<!fir.char<1,?>>)
18ca0a0bf9SJean Perier
19ca0a0bf9SJean Periersubroutine scalar_character_cst_len(c)
20ca0a0bf9SJean Perier  character(10) :: c
21ca0a0bf9SJean Perierend subroutine
22ca0a0bf9SJean Perier! CHECK-LABEL: func.func @_QPscalar_character_cst_len(
23ca0a0bf9SJean Perier! CHECK-SAME:    %[[VAL_0:.*]]: !fir.boxchar<1>
24ca0a0bf9SJean Perier! CHECK:  %[[VAL_1:.*]]:2 = fir.unboxchar %[[VAL_0]] : (!fir.boxchar<1>) -> (!fir.ref<!fir.char<1,?>>, index)
258df59132SSlava Zakharin! CHECK:  %[[VAL_3:.*]] = fir.convert %[[VAL_1]]#0 : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<!fir.char<1,10>>
26c0cb8f73SjeanPerier! CHECK:  %[[VAL_2:.*]] = arith.constant 10 : index
27*1710c8cfSSlava Zakharin! CHECK:  %[[VAL_4:.*]] = hlfir.declare %[[VAL_3]] typeparams %[[VAL_2]] dummy_scope %{{[0-9]+}} {uniq_name = "_QFscalar_character_cst_lenEc"} : (!fir.ref<!fir.char<1,10>>, index, !fir.dscope) -> (!fir.ref<!fir.char<1,10>>, !fir.ref<!fir.char<1,10>>)
28ca0a0bf9SJean Perier
29ca0a0bf9SJean Periersubroutine array_numeric(x)
30ca0a0bf9SJean Perier  integer :: x(10, 20)
31ca0a0bf9SJean Perierend subroutine
32ca0a0bf9SJean Perier! CHECK-LABEL: func.func @_QParray_numeric(
33ca0a0bf9SJean Perier! CHECK-SAME:    %[[VAL_0:.*]]: !fir.ref<!fir.array<10x20xi32>>
34ca0a0bf9SJean Perier! CHECK:  %[[VAL_1:.*]] = arith.constant 10 : index
35ca0a0bf9SJean Perier! CHECK:  %[[VAL_2:.*]] = arith.constant 20 : index
36ca0a0bf9SJean Perier! CHECK:  %[[VAL_3:.*]] = fir.shape %[[VAL_1]], %[[VAL_2]] : (index, index) -> !fir.shape<2>
37*1710c8cfSSlava Zakharin! CHECK:  %[[VAL_4:.*]] = hlfir.declare %[[VAL_0]](%[[VAL_3]]) dummy_scope %{{[0-9]+}} {uniq_name = "_QFarray_numericEx"} : (!fir.ref<!fir.array<10x20xi32>>, !fir.shape<2>, !fir.dscope) -> (!fir.ref<!fir.array<10x20xi32>>, !fir.ref<!fir.array<10x20xi32>>)
38ca0a0bf9SJean Perier
39ca0a0bf9SJean Perier
40ca0a0bf9SJean Periersubroutine array_numeric_lbounds(x)
41ca0a0bf9SJean Perier  integer :: x(-1:10, -2:20)
42ca0a0bf9SJean Perierend subroutine
43ca0a0bf9SJean Perier! CHECK-LABEL: func.func @_QParray_numeric_lbounds(
44ca0a0bf9SJean Perier! CHECK-SAME:    %[[VAL_0:.*]]: !fir.ref<!fir.array<12x23xi32>>
45ca0a0bf9SJean Perier! CHECK:  %[[VAL_1:.*]] = arith.constant -1 : index
46ca0a0bf9SJean Perier! CHECK:  %[[VAL_2:.*]] = arith.constant 12 : index
47ca0a0bf9SJean Perier! CHECK:  %[[VAL_3:.*]] = arith.constant -2 : index
48ca0a0bf9SJean Perier! CHECK:  %[[VAL_4:.*]] = arith.constant 23 : index
4934d3f3fbSJean Perier! CHECK:  %[[VAL_5:.*]] = fir.shape_shift %[[VAL_1]], %[[VAL_2]], %[[VAL_3]], %[[VAL_4]] : (index, index, index, index) -> !fir.shapeshift<2>
50*1710c8cfSSlava Zakharin! CHECK:  %[[VAL_6:.*]] = hlfir.declare %[[VAL_0]](%[[VAL_5]]) dummy_scope %{{[0-9]+}}  {uniq_name = "_QFarray_numeric_lboundsEx"} : (!fir.ref<!fir.array<12x23xi32>>, !fir.shapeshift<2>, !fir.dscope) -> (!fir.box<!fir.array<12x23xi32>>, !fir.ref<!fir.array<12x23xi32>>)
51ca0a0bf9SJean Perier
52ca0a0bf9SJean Periersubroutine array_character(c)
53ca0a0bf9SJean Perier  character(*) :: c(50)
54ca0a0bf9SJean Perierend subroutine
55ca0a0bf9SJean Perier! CHECK-LABEL: func.func @_QParray_character(
56ca0a0bf9SJean Perier! CHECK-SAME:    %[[VAL_0:.*]]: !fir.boxchar<1>
57ca0a0bf9SJean Perier! CHECK:  %[[VAL_1:.*]]:2 = fir.unboxchar %[[VAL_0]] : (!fir.boxchar<1>) -> (!fir.ref<!fir.char<1,?>>, index)
58ca0a0bf9SJean Perier! CHECK:  %[[VAL_2:.*]] = fir.convert %[[VAL_1]]#0 : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<!fir.array<50x!fir.char<1,?>>>
59ca0a0bf9SJean Perier! CHECK:  %[[VAL_3:.*]] = arith.constant 50 : index
60ca0a0bf9SJean Perier! CHECK:  %[[VAL_4:.*]] = fir.shape %[[VAL_3]] : (index) -> !fir.shape<1>
61*1710c8cfSSlava Zakharin! CHECK:  %[[VAL_5:.*]] = hlfir.declare %[[VAL_2]](%[[VAL_4]]) typeparams %[[VAL_1]]#1 dummy_scope %{{[0-9]+}}  {uniq_name = "_QFarray_characterEc"} : (!fir.ref<!fir.array<50x!fir.char<1,?>>>, !fir.shape<1>, index, !fir.dscope) -> (!fir.box<!fir.array<50x!fir.char<1,?>>>, !fir.ref<!fir.array<50x!fir.char<1,?>>>)
62ca0a0bf9SJean Perier
63ca0a0bf9SJean Periersubroutine scalar_numeric_attributes(x)
64ca0a0bf9SJean Perier  integer, optional, target, intent(in) :: x
65ca0a0bf9SJean Perierend subroutine
66ca0a0bf9SJean Perier! CHECK-LABEL: func.func @_QPscalar_numeric_attributes(
67ca0a0bf9SJean Perier! CHECK-SAME:    %[[VAL_0:.*]]: !fir.ref<i32>
68*1710c8cfSSlava Zakharin! CHECK:  %[[VAL_1:.*]] = hlfir.declare %[[VAL_0]] dummy_scope %{{[0-9]+}} {fortran_attrs = #fir.var_attrs<intent_in, optional, target>, uniq_name = "_QFscalar_numeric_attributesEx"} : (!fir.ref<i32>, !fir.dscope) -> (!fir.ref<i32>, !fir.ref<i32>)
69ca0a0bf9SJean Perier
70ca0a0bf9SJean Periersubroutine scalar_numeric_attributes_2(x)
71ca0a0bf9SJean Perier  real(16), value :: x(100)
72ca0a0bf9SJean Perierend subroutine
73ca0a0bf9SJean Perier! CHECK-LABEL: func.func @_QPscalar_numeric_attributes_2(
74ca0a0bf9SJean Perier! CHECK-SAME:    %[[VAL_0:.*]]: !fir.ref<!fir.array<100xf128>>
75ca0a0bf9SJean Perier! CHECK:  %[[VAL_1:.*]] = arith.constant 100 : index
76ca0a0bf9SJean Perier! CHECK:  %[[VAL_2:.*]] = fir.shape %[[VAL_1]] : (index) -> !fir.shape<1>
77*1710c8cfSSlava Zakharin! CHECK:  %[[VAL_3:.*]] = hlfir.declare %[[VAL_0]](%[[VAL_2]]) dummy_scope %{{[0-9]+}} {fortran_attrs = #fir.var_attrs<value>, uniq_name = "_QFscalar_numeric_attributes_2Ex"} : (!fir.ref<!fir.array<100xf128>>, !fir.shape<1>, !fir.dscope) -> (!fir.ref<!fir.array<100xf128>>, !fir.ref<!fir.array<100xf128>>)
78ca0a0bf9SJean Perier
79ca0a0bf9SJean Periersubroutine scalar_numeric_attributes_3(x)
80ca0a0bf9SJean Perier  real, intent(in) :: x
81ca0a0bf9SJean Perierend subroutine
82ca0a0bf9SJean Perier! CHECK-LABEL: func.func @_QPscalar_numeric_attributes_3(
83ca0a0bf9SJean Perier! CHECK-SAME:    %[[VAL_0:.*]]: !fir.ref<f32>
84*1710c8cfSSlava Zakharin! CHECK:  %[[VAL_1:.*]] = hlfir.declare %[[VAL_0]] dummy_scope %{{[0-9]+}} {fortran_attrs = #fir.var_attrs<intent_in>, uniq_name = "_QFscalar_numeric_attributes_3Ex"} : (!fir.ref<f32>, !fir.dscope) -> (!fir.ref<f32>, !fir.ref<f32>)
85ca0a0bf9SJean Perier
86ca0a0bf9SJean Periersubroutine scalar_numeric_attributes_4(x)
87ca0a0bf9SJean Perier  logical(8), intent(out) :: x
88ca0a0bf9SJean Perierend subroutine
89ca0a0bf9SJean Perier! CHECK-LABEL: func.func @_QPscalar_numeric_attributes_4(
90ca0a0bf9SJean Perier! CHECK-SAME:    %[[VAL_0:.*]]: !fir.ref<!fir.logical<8>>
91*1710c8cfSSlava Zakharin! CHECK:  %[[VAL_1:.*]] = hlfir.declare %[[VAL_0]] dummy_scope %{{[0-9]+}} {fortran_attrs = #fir.var_attrs<intent_out>, uniq_name = "_QFscalar_numeric_attributes_4Ex"} : (!fir.ref<!fir.logical<8>>, !fir.dscope) -> (!fir.ref<!fir.logical<8>>, !fir.ref<!fir.logical<8>>)
92ca0a0bf9SJean Perier
93ca0a0bf9SJean Periersubroutine scalar_numeric_parameter()
94ca0a0bf9SJean Perier  integer, parameter :: p = 42
95ca0a0bf9SJean Perierend subroutine
96ca0a0bf9SJean Perier! CHECK-LABEL: func.func @_QPscalar_numeric_parameter() {
97ca0a0bf9SJean Perier! CHECK:  %[[VAL_0:.*]] = fir.address_of(@_QFscalar_numeric_parameterECp) : !fir.ref<i32>
9834d3f3fbSJean Perier! CHECK:  %[[VAL_1:.*]] = hlfir.declare %[[VAL_0]] {fortran_attrs = #fir.var_attrs<parameter>, uniq_name = "_QFscalar_numeric_parameterECp"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
99cd319489SJean Perier
100cd319489SJean Periersubroutine test_component_in_spec_expr(x, derived)
101cd319489SJean Perier  type t
102cd319489SJean Perier    integer :: component
103cd319489SJean Perier  end type
104cd319489SJean Perier  type(t) :: derived
105cd319489SJean Perier  ! Test that we do not try to instantiate "component" just because
106cd319489SJean Perier  ! its symbol appears in a specification expression.
107cd319489SJean Perier  real :: x(derived%component)
108cd319489SJean Perierend subroutine
109cd319489SJean Perier! CHECK-LABEL: func.func @_QPtest_component_in_spec_expr(
110cd319489SJean Perier! CHECK-NOT: alloca
111cd319489SJean Perier! CHECK: return
112