160 lines · plain
1! Test questionable but existing abuses of implicit interfaces.2! Lowering must close the eyes and do as if it did not know3! about the function definition since semantic lets these4! programs through with a warning.5! RUN: bbc -emit-hlfir %s -o - | FileCheck %s6 7subroutine takes_char(c)8 character(8) :: c9end subroutine10 11subroutine pass_real_to_char(r)12 real(8) :: r13 call takes_char(r)14end subroutine15! CHECK-LABEL: func.func @_QPpass_real_to_char(16! CHECK: %[[VAL_1:.*]]:2 = hlfir.declare {{.*}}Er17! CHECK: %[[VAL_2:.*]] = fir.address_of(@_QPtakes_char) : (!fir.boxchar<1>) -> ()18! CHECK: %[[VAL_3:.*]] = fir.convert %[[VAL_2]] : ((!fir.boxchar<1>) -> ()) -> ((!fir.ref<f64>) -> ())19! CHECK: fir.call %[[VAL_3]](%[[VAL_1]]#0) {{.*}}: (!fir.ref<f64>) -> ()20 21subroutine pass_char_proc_to_char()22 character(8), external :: char_proc23 call takes_char(char_proc)24end subroutine25! CHECK: %[[VAL_0:.*]] = fir.address_of(@_QPchar_proc) : (!fir.ref<!fir.char<1,8>>, index) -> !fir.boxchar<1>26! CHECK: %[[VAL_1:.*]] = arith.constant 8 : i6427! CHECK: %[[VAL_2:.*]] = fir.emboxproc %[[VAL_0]] : ((!fir.ref<!fir.char<1,8>>, index) -> !fir.boxchar<1>) -> !fir.boxproc<() -> ()>28! CHECK: %[[VAL_3:.*]] = fir.undefined tuple<!fir.boxproc<() -> ()>, i64>29! CHECK: %[[VAL_4:.*]] = fir.insert_value %[[VAL_3]], %[[VAL_2]], [0 : index] : (tuple<!fir.boxproc<() -> ()>, i64>, !fir.boxproc<() -> ()>) -> tuple<!fir.boxproc<() -> ()>, i64>30! CHECK: %[[VAL_5:.*]] = fir.insert_value %[[VAL_4]], %[[VAL_1]], [1 : index] : (tuple<!fir.boxproc<() -> ()>, i64>, i64) -> tuple<!fir.boxproc<() -> ()>, i64>31! CHECK: %[[VAL_6:.*]] = fir.address_of(@_QPtakes_char) : (!fir.boxchar<1>) -> ()32! CHECK: %[[VAL_7:.*]] = fir.convert %[[VAL_6]] : ((!fir.boxchar<1>) -> ()) -> ((tuple<!fir.boxproc<() -> ()>, i64>) -> ())33! CHECK: fir.call %[[VAL_7]](%[[VAL_5]]) {{.*}}: (tuple<!fir.boxproc<() -> ()>, i64>) -> ()34 35subroutine pass_kind2_char_to_char(c)36 character(4, kind=2) :: c37 call takes_char(c)38end subroutine39! CHECK-LABEL: func.func @_QPpass_kind2_char_to_char(40! CHECK: %[[VAL_2:.*]]:2 = hlfir.declare {{.*}}Ec41! CHECK: %[[VAL_3:.*]] = fir.emboxchar %[[VAL_2]]#0, %{{.*}} : (!fir.ref<!fir.char<2,4>>, index) -> !fir.boxchar<2>42! CHECK: %[[VAL_4:.*]] = fir.address_of(@_QPtakes_char) : (!fir.boxchar<1>) -> ()43! CHECK: %[[VAL_5:.*]] = fir.convert %[[VAL_4]] : ((!fir.boxchar<1>) -> ()) -> ((!fir.boxchar<2>) -> ())44! CHECK: fir.call %[[VAL_5]](%[[VAL_3]]) {{.*}}: (!fir.boxchar<2>) -> ()45 46subroutine takes_real(r)47 real(8) :: r48end subroutine49 50subroutine pass_int_to_real(i)51 integer(8) :: i52 call takes_real(i)53end subroutine54! CHECK-LABEL: func.func @_QPpass_int_to_real(55! CHECK: %[[VAL_1:.*]]:2 = hlfir.declare {{.*}}Ei56! CHECK: %[[VAL_2:.*]] = fir.convert %[[VAL_1]]#0 : (!fir.ref<i64>) -> !fir.ref<f64>57! CHECK: fir.call @_QPtakes_real(%[[VAL_2]]) {{.*}}: (!fir.ref<f64>) -> ()58 59subroutine pass_char_to_real(c)60 character(8) :: c61 call takes_real(c)62end subroutine63! CHECK-LABEL: func.func @_QPpass_char_to_real(64! CHECK: %[[VAL_2:.*]]:2 = hlfir.declare {{.*}}Ec65! CHECK: %[[VAL_3:.*]] = fir.emboxchar %[[VAL_2]]#0, %{{.*}} : (!fir.ref<!fir.char<1,8>>, index) -> !fir.boxchar<1>66! CHECK: %[[VAL_4:.*]] = fir.address_of(@_QPtakes_real) : (!fir.ref<f64>) -> ()67! CHECK: %[[VAL_5:.*]] = fir.convert %[[VAL_4]] : ((!fir.ref<f64>) -> ()) -> ((!fir.boxchar<1>) -> ())68! CHECK: fir.call %[[VAL_5]](%[[VAL_3]]) {{.*}}: (!fir.boxchar<1>) -> ()69 70subroutine pass_proc_to_real()71 real(8), external :: proc72 call takes_real(proc)73end subroutine74! CHECK-LABEL: func.func @_QPpass_proc_to_real() {75! CHECK: %[[VAL_0:.*]] = fir.address_of(@_QPproc) : () -> f6476! CHECK: %[[VAL_1:.*]] = fir.emboxproc %[[VAL_0]] : (() -> f64) -> !fir.boxproc<() -> ()>77! CHECK: %[[VAL_2:.*]] = fir.address_of(@_QPtakes_real) : (!fir.ref<f64>) -> ()78! CHECK: %[[VAL_3:.*]] = fir.convert %[[VAL_2]] : ((!fir.ref<f64>) -> ()) -> ((!fir.boxproc<() -> ()>) -> ())79! CHECK: fir.call %[[VAL_3]](%[[VAL_1]]) {{.*}}: (!fir.boxproc<() -> ()>) -> ()80 81subroutine pass_complex_to_real(cmplx)82 complex(4) :: cmplx83 call takes_real(cmplx)84end subroutine85! CHECK-LABEL: func.func @_QPpass_complex_to_real(86! CHECK: %[[VAL_1:.*]]:2 = hlfir.declare {{.*}}Ecmplx87! CHECK: %[[VAL_2:.*]] = fir.convert %[[VAL_1]]#0 : (!fir.ref<complex<f32>>) -> !fir.ref<f64>88! CHECK: fir.call @_QPtakes_real(%[[VAL_2]]) {{.*}}: (!fir.ref<f64>) -> ()89 90subroutine takes_char_proc(c)91 character(8), external :: c92end subroutine93 94subroutine pass_proc_to_char_proc()95 external :: proc96 call takes_char_proc(proc)97end subroutine98! CHECK-LABEL: func.func @_QPpass_proc_to_char_proc() {99! CHECK: %[[VAL_0:.*]] = fir.address_of(@_QPproc) : () -> f64100! CHECK: %[[VAL_1:.*]] = fir.emboxproc %[[VAL_0]] : (() -> f64) -> !fir.boxproc<() -> ()>101! CHECK: %[[VAL_2:.*]] = fir.address_of(@_QPtakes_char_proc) : (tuple<!fir.boxproc<() -> ()>, i64>) -> ()102! CHECK: %[[VAL_3:.*]] = fir.convert %[[VAL_2]] : ((tuple<!fir.boxproc<() -> ()>, i64>) -> ()) -> ((!fir.boxproc<() -> ()>) -> ())103! CHECK: fir.call %[[VAL_3]](%[[VAL_1]]) {{.*}}: (!fir.boxproc<() -> ()>) -> ()104 105subroutine pass_char_to_char_proc(c)106 character(8) :: c107 call takes_char_proc(c)108end subroutine109! CHECK-LABEL: func.func @_QPpass_char_to_char_proc(110! CHECK: %[[VAL_2:.*]]:2 = hlfir.declare {{.*}}Ec111! CHECK: %[[VAL_3:.*]] = fir.emboxchar %[[VAL_2]]#0, %{{.*}} : (!fir.ref<!fir.char<1,8>>, index) -> !fir.boxchar<1>112! CHECK: %[[VAL_4:.*]] = fir.address_of(@_QPtakes_char_proc) : (tuple<!fir.boxproc<() -> ()>, i64>) -> ()113! CHECK: %[[VAL_5:.*]] = fir.convert %[[VAL_4]] : ((tuple<!fir.boxproc<() -> ()>, i64>) -> ()) -> ((!fir.boxchar<1>) -> ())114! CHECK: fir.call %[[VAL_5]](%[[VAL_3]]) {{.*}}: (!fir.boxchar<1>) -> ()115 116subroutine takes_proc(proc)117 real(8), external :: proc118end subroutine119 120subroutine pass_char_proc_to_proc()121 character(8), external :: char_proc122 call takes_proc(char_proc)123end subroutine124! CHECK-LABEL: func.func @_QPpass_char_proc_to_proc() {125! CHECK: %[[VAL_0:.*]] = fir.address_of(@_QPchar_proc) : (!fir.ref<!fir.char<1,8>>, index) -> !fir.boxchar<1>126! CHECK: %[[VAL_1:.*]] = arith.constant 8 : i64127! CHECK: %[[VAL_2:.*]] = fir.emboxproc %[[VAL_0]] : ((!fir.ref<!fir.char<1,8>>, index) -> !fir.boxchar<1>) -> !fir.boxproc<() -> ()>128! CHECK: %[[VAL_3:.*]] = fir.undefined tuple<!fir.boxproc<() -> ()>, i64>129! CHECK: %[[VAL_4:.*]] = fir.insert_value %[[VAL_3]], %[[VAL_2]], [0 : index] : (tuple<!fir.boxproc<() -> ()>, i64>, !fir.boxproc<() -> ()>) -> tuple<!fir.boxproc<() -> ()>, i64>130! CHECK: %[[VAL_5:.*]] = fir.insert_value %[[VAL_4]], %[[VAL_1]], [1 : index] : (tuple<!fir.boxproc<() -> ()>, i64>, i64) -> tuple<!fir.boxproc<() -> ()>, i64>131! CHECK: %[[VAL_6:.*]] = fir.address_of(@_QPtakes_proc) : (!fir.boxproc<() -> ()>) -> ()132! CHECK: %[[VAL_7:.*]] = fir.convert %[[VAL_6]] : ((!fir.boxproc<() -> ()>) -> ()) -> ((tuple<!fir.boxproc<() -> ()>, i64>) -> ())133! CHECK: fir.call %[[VAL_7]](%[[VAL_5]]) {{.*}}: (tuple<!fir.boxproc<() -> ()>, i64>) -> ()134 135subroutine pass_real_to_proc(r)136 real(8) :: r137 call takes_proc(r)138end subroutine139! CHECK-LABEL: func.func @_QPpass_real_to_proc(140! CHECK: %[[VAL_1:.*]]:2 = hlfir.declare {{.*}}Er141! CHECK: %[[VAL_2:.*]] = fir.address_of(@_QPtakes_proc) : (!fir.boxproc<() -> ()>) -> ()142! CHECK: %[[VAL_3:.*]] = fir.convert %[[VAL_2]] : ((!fir.boxproc<() -> ()>) -> ()) -> ((!fir.ref<f64>) -> ())143! CHECK: fir.call %[[VAL_3]](%[[VAL_1]]#0) {{.*}}: (!fir.ref<f64>) -> ()144 145subroutine pass_too_many_args()146 call takes_real(I, Kown, what, I, am, doing)147end subroutine148! CHECK-LABEL: func.func @_QPpass_too_many_args() {149! CHECK: %[[VAL_10:.*]] = fir.address_of(@_QPtakes_real) : (!fir.ref<f64>) -> ()150! CHECK: %[[VAL_11:.*]] = fir.convert %[[VAL_10]] : ((!fir.ref<f64>) -> ()) -> ((!fir.ref<i32>, !fir.ref<i32>, !fir.ref<f32>, !fir.ref<i32>, !fir.ref<f32>, !fir.ref<f32>) -> ())151! CHECK: fir.call %[[VAL_11]](%{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}) {{.*}}: (!fir.ref<i32>, !fir.ref<i32>, !fir.ref<f32>, !fir.ref<i32>, !fir.ref<f32>, !fir.ref<f32>) -> ()152 153subroutine pass_too_few_args()154 call takes_real()155end subroutine156! CHECK-LABEL: func.func @_QPpass_too_few_args() {157! CHECK: %[[VAL_0:.*]] = fir.address_of(@_QPtakes_real) : (!fir.ref<f64>) -> ()158! CHECK: %[[VAL_1:.*]] = fir.convert %[[VAL_0]] : ((!fir.ref<f64>) -> ()) -> (() -> ())159! CHECK: fir.call %[[VAL_1]]() {{.*}}: () -> ()160