! RUN: bbc -emit-hlfir %s -o - | FileCheck %s ! RUN: %flang_fc1 -emit-hlfir %s -o - | FileCheck %s ! Test LOC intrinsic ! CHECK-LABEL: func.func @_QPloc_scalar() { subroutine loc_scalar() integer(8) :: p integer :: x p = loc(x) ! CHECK: %[[VAL_1:.*]]:2 = hlfir.declare %[[VAL_0:[a-z0-9]*]] {{.*}}Ep ! CHECK: %[[VAL_3:.*]]:2 = hlfir.declare %[[VAL_2:[a-z0-9]*]] {{.*}}Ex ! CHECK: %[[VAL_4:.*]] = fir.embox %[[VAL_3]]#1 : (!fir.ref) -> !fir.box ! CHECK: %[[VAL_5:.*]] = fir.box_addr %[[VAL_4]] : (!fir.box) -> !fir.ref ! CHECK: %[[VAL_6:.*]] = fir.convert %[[VAL_5]] : (!fir.ref) -> i64 ! CHECK: hlfir.assign %[[VAL_6]] to %[[VAL_1]]#0 : i64, !fir.ref end ! CHECK-LABEL: func.func @_QPloc_char() { subroutine loc_char() integer(8) :: p character(5) :: x = "abcde" p = loc(x) ! CHECK: %[[VAL_1:.*]]:2 = hlfir.declare %[[VAL_0:[a-z0-9]*]] {{.*}}Ep ! CHECK: %[[VAL_4:.*]]:2 = hlfir.declare %[[VAL_2:[a-z0-9]*]] typeparams %[[VAL_3:[a-z0-9]*]] {{.*}}Ex ! CHECK: %[[VAL_5:.*]] = fir.embox %[[VAL_4]]#1 : (!fir.ref>) -> !fir.box> ! CHECK: %[[VAL_6:.*]] = fir.box_addr %[[VAL_5]] : (!fir.box>) -> !fir.ref> ! CHECK: %[[VAL_7:.*]] = fir.convert %[[VAL_6]] : (!fir.ref>) -> i64 ! CHECK: hlfir.assign %[[VAL_7]] to %[[VAL_1]]#0 : i64, !fir.ref end ! CHECK-LABEL: func.func @_QPloc_substring() { subroutine loc_substring() integer(8) :: p character(5) :: x = "abcde" p = loc(x(2:)) ! CHECK: %[[VAL_1:.*]]:2 = hlfir.declare %[[VAL_0:[a-z0-9]*]] {{.*}}Ep ! CHECK: %[[VAL_4:.*]]:2 = hlfir.declare %[[VAL_2:[a-z0-9]*]] typeparams %[[VAL_3:[a-z0-9]*]] {{.*}}Ex ! CHECK: %[[VAL_5:.*]] = arith.constant 2 : index ! CHECK: %[[VAL_6:.*]] = arith.constant 5 : index ! CHECK: %[[VAL_7:.*]] = arith.constant 4 : index ! CHECK: %[[VAL_8:.*]] = hlfir.designate %[[VAL_4]]#0 substr %[[VAL_5]], %[[VAL_6]] typeparams %[[VAL_7]] : (!fir.ref>, index, index, index) -> !fir.ref> ! CHECK: %[[VAL_9:.*]] = fir.embox %[[VAL_8]] : (!fir.ref>) -> !fir.box> ! CHECK: %[[VAL_10:.*]] = fir.box_addr %[[VAL_9]] : (!fir.box>) -> !fir.ref> ! CHECK: %[[VAL_11:.*]] = fir.convert %[[VAL_10]] : (!fir.ref>) -> i64 ! CHECK: hlfir.assign %[[VAL_11]] to %[[VAL_1]]#0 : i64, !fir.ref end ! CHECK-LABEL: func.func @_QPloc_array() { subroutine loc_array integer(8) :: p integer :: x(10) p = loc(x) ! CHECK: %[[VAL_1:.*]]:2 = hlfir.declare %[[VAL_0:[a-z0-9]*]] {{.*}}Ep ! CHECK: %[[VAL_5:.*]]:2 = hlfir.declare %[[VAL_3:[a-z0-9]*]](%[[VAL_4:[a-z0-9]*]]) {{.*}}Ex ! CHECK: %[[VAL_7:.*]] = fir.embox %[[VAL_5]]#1(%{{.*}}) : (!fir.ref>, !fir.shape<1>) -> !fir.box> ! CHECK: %[[VAL_8:.*]] = fir.box_addr %[[VAL_7]] : (!fir.box>) -> !fir.ref> ! CHECK: %[[VAL_9:.*]] = fir.convert %[[VAL_8]] : (!fir.ref>) -> i64 ! CHECK: hlfir.assign %[[VAL_9]] to %[[VAL_1]]#0 : i64, !fir.ref end ! CHECK-LABEL: func.func @_QPloc_chararray() { subroutine loc_chararray() integer(8) :: p character(5) :: x(2) p = loc(x) ! CHECK: %[[VAL_1:.*]]:2 = hlfir.declare %[[VAL_0:[a-z0-9]*]] {{.*}}Ep ! CHECK: %[[VAL_6:.*]]:2 = hlfir.declare %[[VAL_4:[a-z0-9]*]](%[[VAL_5:[a-z0-9]*]]) typeparams %[[VAL_2:[a-z0-9]*]] {{.*}}Ex ! CHECK: %[[VAL_8:.*]] = fir.embox %[[VAL_6]]#1(%{{.*}}) : (!fir.ref>>, !fir.shape<1>) -> !fir.box>> ! CHECK: %[[VAL_9:.*]] = fir.box_addr %[[VAL_8]] : (!fir.box>>) -> !fir.ref>> ! CHECK: %[[VAL_10:.*]] = fir.convert %[[VAL_9]] : (!fir.ref>>) -> i64 ! CHECK: hlfir.assign %[[VAL_10]] to %[[VAL_1]]#0 : i64, !fir.ref end ! CHECK-LABEL: func.func @_QPloc_arrayelement() { subroutine loc_arrayelement() integer(8) :: p integer :: x(10) p = loc(x(7)) ! CHECK: %[[VAL_1:.*]]:2 = hlfir.declare %[[VAL_0:[a-z0-9]*]] {{.*}}Ep ! CHECK: %[[VAL_5:.*]]:2 = hlfir.declare %[[VAL_3:[a-z0-9]*]](%[[VAL_4:[a-z0-9]*]]) {{.*}}Ex ! CHECK: %[[VAL_6:.*]] = arith.constant 7 : index ! CHECK: %[[VAL_7:.*]] = hlfir.designate %[[VAL_5]]#0 (%[[VAL_6]]) : (!fir.ref>, index) -> !fir.ref ! CHECK: %[[VAL_8:.*]] = fir.embox %[[VAL_7]] : (!fir.ref) -> !fir.box ! CHECK: %[[VAL_9:.*]] = fir.box_addr %[[VAL_8]] : (!fir.box) -> !fir.ref ! CHECK: %[[VAL_10:.*]] = fir.convert %[[VAL_9]] : (!fir.ref) -> i64 ! CHECK: hlfir.assign %[[VAL_10]] to %[[VAL_1]]#0 : i64, !fir.ref end ! CHECK-LABEL: func.func @_QPloc_arraysection( ! CHECK-SAME: %[[arg:.*]]: !fir.ref {{.*}}) { subroutine loc_arraysection(i) integer(8) :: p integer :: i real :: x(11) p = loc(x(i:)) ! CHECK: %[[VAL_1:.*]]:2 = hlfir.declare %[[VAL_0:[a-z0-9]*]] {{.*}}Ei ! CHECK: %[[VAL_3:.*]]:2 = hlfir.declare %[[VAL_2:[a-z0-9]*]] {{.*}}Ep ! CHECK: %[[VAL_7:.*]]:2 = hlfir.declare %[[VAL_5:[a-z0-9]*]](%[[VAL_6:[a-z0-9]*]]) {{.*}}Ex ! CHECK: %[[VAL_19:.*]] = hlfir.designate %[[VAL_7]]#0 (%{{.*}}:%{{.*}}:%{{.*}}) shape %{{.*}} : (!fir.ref>, index, index, index, !fir.shape<1>) -> !fir.box> ! CHECK: %[[VAL_20:.*]] = fir.box_addr %[[VAL_19]] : (!fir.box>) -> !fir.ref> ! CHECK: %[[VAL_21:.*]] = fir.convert %[[VAL_20]] : (!fir.ref>) -> i64 ! CHECK: hlfir.assign %[[VAL_21]] to %[[VAL_3]]#0 : i64, !fir.ref end ! CHECK-LABEL: func.func @_QPloc_non_save_pointer_scalar() { subroutine loc_non_save_pointer_scalar() integer(8) :: p real, pointer :: x real, target :: t x => t p = loc(x) ! CHECK: %[[VAL_1:.*]]:2 = hlfir.declare %[[VAL_0:[a-z0-9]*]] {{.*}}Ep ! CHECK: %[[VAL_3:.*]]:2 = hlfir.declare %[[VAL_2:[a-z0-9]*]] {{.*}}Et ! CHECK: %[[VAL_7:.*]]:2 = hlfir.declare %[[VAL_4:[a-z0-9]*]] {{.*}}Ex ! CHECK: %[[VAL_8:.*]] = fir.embox %[[VAL_3]]#1 : (!fir.ref) -> !fir.box> ! CHECK: fir.store %[[VAL_8]] to %[[VAL_7]]#1 : !fir.ref>> ! CHECK: %[[VAL_9:.*]] = fir.load %[[VAL_7]]#1 : !fir.ref>> ! CHECK: %[[VAL_10:.*]] = fir.box_addr %[[VAL_9]] : (!fir.box>) -> !fir.ptr ! CHECK: %[[VAL_11:.*]] = fir.convert %[[VAL_10]] : (!fir.ptr) -> i64 ! CHECK: hlfir.assign %[[VAL_11]] to %[[VAL_1]]#0 : i64, !fir.ref end ! CHECK-LABEL: func.func @_QPloc_save_pointer_scalar() { subroutine loc_save_pointer_scalar() integer :: p real, pointer, save :: x p = loc(x) ! CHECK: %[[VAL_1:.*]]:2 = hlfir.declare %[[VAL_0:[a-z0-9]*]] {{.*}}Ep ! CHECK: %[[VAL_3:.*]]:2 = hlfir.declare %[[VAL_2:[a-z0-9]*]] {{.*}}Ex ! CHECK: %[[VAL_4:.*]] = fir.load %[[VAL_3]]#1 : !fir.ref>> ! CHECK: %[[VAL_5:.*]] = fir.box_addr %[[VAL_4]] : (!fir.box>) -> !fir.ptr ! CHECK: %[[VAL_6:.*]] = fir.convert %[[VAL_5]] : (!fir.ptr) -> i64 ! CHECK: %[[VAL_7:.*]] = fir.convert %[[VAL_6]] : (i64) -> i32 ! CHECK: hlfir.assign %[[VAL_7]] to %[[VAL_1]]#0 : i32, !fir.ref end ! CHECK-LABEL: func.func @_QPloc_derived_type() { subroutine loc_derived_type integer(8) :: p type dt integer :: i end type type(dt) :: xdt p = loc(xdt) ! CHECK: %[[VAL_1:.*]]:2 = hlfir.declare %[[VAL_0:[a-z0-9]*]] {{.*}}Ep ! CHECK: %[[VAL_3:.*]]:2 = hlfir.declare %[[VAL_2:[a-z0-9]*]] {{.*}}Exdt ! CHECK: %[[VAL_4:.*]] = fir.embox %[[VAL_3]]#1 : (!fir.ref>) -> !fir.box> ! CHECK: %[[VAL_5:.*]] = fir.box_addr %[[VAL_4]] : (!fir.box>) -> !fir.ref> ! CHECK: %[[VAL_6:.*]] = fir.convert %[[VAL_5]] : (!fir.ref>) -> i64 ! CHECK: hlfir.assign %[[VAL_6]] to %[[VAL_1]]#0 : i64, !fir.ref end ! CHECK-LABEL: func.func @_QPloc_pointer_array() { subroutine loc_pointer_array integer(8) :: p integer, pointer :: x(:) p = loc(x) ! CHECK: %[[VAL_1:.*]]:2 = hlfir.declare %[[VAL_0:[a-z0-9]*]] {{.*}}Ep ! CHECK: %[[VAL_7:.*]]:2 = hlfir.declare %[[VAL_2:[a-z0-9]*]] {{.*}}Ex ! CHECK: %[[VAL_8:.*]] = fir.load %[[VAL_7]]#1 : !fir.ref>>> ! CHECK: %[[VAL_9:.*]] = fir.box_addr %[[VAL_8]] : (!fir.box>>) -> !fir.ptr> ! CHECK: %[[VAL_10:.*]] = fir.convert %[[VAL_9]] : (!fir.ptr>) -> i64 ! CHECK: hlfir.assign %[[VAL_10]] to %[[VAL_1]]#0 : i64, !fir.ref end ! CHECK-LABEL: func.func @_QPloc_allocatable_array() { subroutine loc_allocatable_array integer(8) :: p integer, allocatable :: x(:) p = loc(x) ! CHECK: %[[VAL_1:.*]]:2 = hlfir.declare %[[VAL_0:[a-z0-9]*]] {{.*}}Ep ! CHECK: %[[VAL_7:.*]]:2 = hlfir.declare %[[VAL_2:[a-z0-9]*]] {{.*}}Ex ! CHECK: %[[VAL_8:.*]] = fir.load %[[VAL_7]]#1 : !fir.ref>>> ! CHECK: %[[VAL_9:.*]] = fir.box_addr %[[VAL_8]] : (!fir.box>>) -> !fir.heap> ! CHECK: %[[VAL_10:.*]] = fir.convert %[[VAL_9]] : (!fir.heap>) -> i64 ! CHECK: hlfir.assign %[[VAL_10]] to %[[VAL_1]]#0 : i64, !fir.ref end ! CHECK-LABEL: func.func @_QPtest_external() { subroutine test_external() integer(8) :: p integer, external :: f p = loc(x=f) ! CHECK: %[[VAL_1:.*]]:2 = hlfir.declare %[[VAL_0:[a-z0-9]*]] {{.*}}Ep ! CHECK: %[[VAL_2:.*]] = fir.address_of(@_QPf) : () -> i32 ! CHECK: %[[VAL_3:.*]] = fir.emboxproc %[[VAL_2]] : (() -> i32) -> !fir.boxproc<() -> ()> ! CHECK: %[[VAL_4:.*]] = fir.box_addr %[[VAL_3]] : (!fir.boxproc<() -> ()>) -> (() -> ()) ! CHECK: %[[VAL_5:.*]] = fir.convert %[[VAL_4]] : (() -> ()) -> i64 ! CHECK: hlfir.assign %[[VAL_5]] to %[[VAL_1]]#0 : i64, !fir.ref end ! CHECK-LABEL: func.func @_QPtest_proc() { subroutine test_proc() integer(8) :: p procedure() :: g p = loc(x=g) ! CHECK: %[[VAL_1:.*]]:2 = hlfir.declare %[[VAL_0:[a-z0-9]*]] {{.*}}Ep ! CHECK: %[[VAL_2:.*]] = fir.address_of(@_QPg) : () -> () ! CHECK: %[[VAL_3:.*]] = fir.emboxproc %[[VAL_2]] : (() -> ()) -> !fir.boxproc<() -> ()> ! CHECK: %[[VAL_4:.*]] = fir.box_addr %[[VAL_3]] : (!fir.boxproc<() -> ()>) -> (() -> ()) ! CHECK: %[[VAL_5:.*]] = fir.convert %[[VAL_4]] : (() -> ()) -> i64 ! CHECK: hlfir.assign %[[VAL_5]] to %[[VAL_1]]#0 : i64, !fir.ref end ! CHECK-LABEL: func.func @_QPtest_assumed_shape_optional( subroutine test_assumed_shape_optional(x) integer(8) :: p real, optional :: x(:) p = loc(x=x) ! CHECK: %[[VAL_2:.*]]:2 = hlfir.declare %[[VAL_1:[a-z0-9]*]] {{.*}}Ep ! CHECK: %[[VAL_3:.*]]:2 = hlfir.declare %[[VAL_0:[a-z0-9]*]] {{.*}}Ex ! CHECK: %[[VAL_4:.*]] = fir.is_present %[[VAL_3]]#1 : (!fir.box>) -> i1 ! CHECK: %[[VAL_5:.*]] = fir.if %[[VAL_4]] -> (i64) { ! CHECK: %[[VAL_6:.*]] = fir.box_addr %[[VAL_3]]#1 : (!fir.box>) -> !fir.ref> ! CHECK: %[[VAL_7:.*]] = fir.convert %[[VAL_6]] : (!fir.ref>) -> i64 ! CHECK: fir.result %[[VAL_7]] : i64 ! CHECK: } else { ! CHECK: %[[VAL_8:.*]] = arith.constant 0 : i64 ! CHECK: fir.result %[[VAL_8]] : i64 ! CHECK: } ! CHECK: hlfir.assign %[[VAL_5]] to %[[VAL_2]]#0 : i64, !fir.ref end subroutine