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