brintos

brintos / llvm-project-archived public Read only

0
0
Text · 8.2 KiB · dd9019d Raw
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