1e28e1b4bSValentin Clement! Test for PassBy::Value 2ad4e1abaSjeanPerier! RUN: bbc -emit-fir %s -o - | FileCheck %s 3205b4740SPeixin Qiao 4205b4740SPeixin Qiao!CHECK-LABEL: func @_QQmain() 5205b4740SPeixin Qiao!CHECK: %false = arith.constant false 6ad4e1abaSjeanPerier!CHECK: %[[LOGICAL_ALLOC:.*]] = fir.alloca !fir.logical<1> 7ad4e1abaSjeanPerier!CHECK: %[[LOGICAL:.*]] = fir.declare %[[LOGICAL_ALLOC]] 8199402c3SPeter Klausler!CHECK: %[[VALUE:.*]] = fir.convert %false : (i1) -> !fir.logical<1> 9205b4740SPeixin Qiao!CHECK: fir.store %[[VALUE]] to %[[LOGICAL]] 10205b4740SPeixin Qiao!CHECK: %[[LOAD:.*]] = fir.load %[[LOGICAL]] 114cc9437aSTom Eccles!CHECK: fir.call @omp_set_nested(%[[LOAD]]) {{.*}}: {{.*}} 12205b4740SPeixin Qiao 13e28e1b4bSValentin Clementprogram call_by_value 14199402c3SPeter Klausler use iso_c_binding, only: c_bool 15e28e1b4bSValentin Clement interface 16e28e1b4bSValentin Clement subroutine omp_set_nested(enable) bind(c) 17199402c3SPeter Klausler import c_bool 18199402c3SPeter Klausler logical(c_bool), value :: enable 19e28e1b4bSValentin Clement end subroutine omp_set_nested 20e28e1b4bSValentin Clement end interface 21e28e1b4bSValentin Clement 22199402c3SPeter Klausler logical(c_bool) do_nested 23e28e1b4bSValentin Clement do_nested = .FALSE. 24e28e1b4bSValentin Clement call omp_set_nested(do_nested) 25e28e1b4bSValentin Clementend program call_by_value 26205b4740SPeixin Qiao 27205b4740SPeixin Qiao! CHECK-LABEL: func.func @test_integer_value( 28ad4e1abaSjeanPerier! CHECK-SAME: %[[VAL_0:.*]]: i32 29205b4740SPeixin Qiao! CHECK: %[[VAL_1:.*]] = fir.alloca i32 30205b4740SPeixin Qiao! CHECK: fir.store %[[VAL_0]] to %[[VAL_1]] : !fir.ref<i32> 31ad4e1abaSjeanPerier! CHECK: %[[VAL_2:.*]] = fir.declare %[[VAL_1]] 32ad4e1abaSjeanPerier! CHECK: fir.call @_QPinternal_call(%[[VAL_2]]) {{.*}}: (!fir.ref<i32>) -> () 33205b4740SPeixin Qiao! CHECK: return 34205b4740SPeixin Qiao! CHECK: } 35205b4740SPeixin Qiao 36205b4740SPeixin Qiaosubroutine test_integer_value(x) bind(c) 37205b4740SPeixin Qiao integer, value :: x 38205b4740SPeixin Qiao call internal_call(x) 39205b4740SPeixin Qiaoend 40205b4740SPeixin Qiao! CHECK-LABEL: func.func @test_real_value( 41ad4e1abaSjeanPerier! CHECK-SAME: %[[VAL_0:.*]]: f32 42205b4740SPeixin Qiao! CHECK: %[[VAL_1:.*]] = fir.alloca f32 43205b4740SPeixin Qiao! CHECK: fir.store %[[VAL_0]] to %[[VAL_1]] : !fir.ref<f32> 44ad4e1abaSjeanPerier! CHECK: %[[VAL_2:.*]] = fir.declare %[[VAL_1]] 45ad4e1abaSjeanPerier! CHECK: fir.call @_QPinternal_call2(%[[VAL_2]]) {{.*}}: (!fir.ref<f32>) -> () 46205b4740SPeixin Qiao! CHECK: return 47205b4740SPeixin Qiao! CHECK: } 48205b4740SPeixin Qiao 49ad4e1abaSjeanPerier 50205b4740SPeixin Qiaosubroutine test_real_value(x) bind(c) 51205b4740SPeixin Qiao real, value :: x 52205b4740SPeixin Qiao call internal_call2(x) 53205b4740SPeixin Qiaoend 54205b4740SPeixin Qiao! CHECK-LABEL: func.func @test_complex_value( 55*c4204c0bSjeanPerier! CHECK-SAME: %[[VAL_0:.*]]: complex<f32> 56*c4204c0bSjeanPerier! CHECK: %[[VAL_1:.*]] = fir.alloca complex<f32> 57*c4204c0bSjeanPerier! CHECK: fir.store %[[VAL_0]] to %[[VAL_1]] : !fir.ref<complex<f32>> 58ad4e1abaSjeanPerier! CHECK: %[[VAL_2:.*]] = fir.declare %[[VAL_1]] 59*c4204c0bSjeanPerier! CHECK: fir.call @_QPinternal_call3(%[[VAL_2]]) {{.*}}: (!fir.ref<complex<f32>>) -> () 60205b4740SPeixin Qiao! CHECK: return 61205b4740SPeixin Qiao! CHECK: } 62205b4740SPeixin Qiao 63ad4e1abaSjeanPerier 64205b4740SPeixin Qiaosubroutine test_complex_value(x) bind(c) 65205b4740SPeixin Qiao complex, value :: x 66205b4740SPeixin Qiao call internal_call3(x) 67205b4740SPeixin Qiaoend 68205b4740SPeixin Qiao 69205b4740SPeixin Qiao! CHECK-LABEL: func.func @test_char_value( 70ad4e1abaSjeanPerier! CHECK-SAME: %[[VAL_0:.*]]: !fir.char<1> 71ad4e1abaSjeanPerier! CHECK: %[[VAL_1:.*]] = arith.constant 1 : index 72ad4e1abaSjeanPerier! CHECK: %[[VAL_2:.*]] = fir.alloca !fir.char<1> 73ad4e1abaSjeanPerier! CHECK: fir.store %[[VAL_0]] to %[[VAL_2]] : !fir.ref<!fir.char<1>> 74ad4e1abaSjeanPerier! CHECK: %[[VAL_3:.*]] = fir.declare %[[VAL_2]] typeparams %[[VAL_1]] 75ad4e1abaSjeanPerier! CHECK: %[[VAL_4:.*]] = fir.emboxchar %[[VAL_3]], %[[VAL_1]] : (!fir.ref<!fir.char<1>>, index) -> !fir.boxchar<1> 76ad4e1abaSjeanPerier! CHECK: fir.call @_QPinternal_call4(%[[VAL_4]]) {{.*}}: (!fir.boxchar<1>) -> () 77205b4740SPeixin Qiao! CHECK: return 78205b4740SPeixin Qiao! CHECK: } 79205b4740SPeixin Qiao 80205b4740SPeixin Qiaosubroutine test_char_value(x) bind(c) 81205b4740SPeixin Qiao character(1), value :: x 82205b4740SPeixin Qiao call internal_call4(x) 83205b4740SPeixin Qiaoend 84fe9409b9SPeixin Qiao 85ad4e1abaSjeanPerier! CHECK-LABEL: func.func @_QPtest_call_char_value( 86ad4e1abaSjeanPerier! CHECK-SAME: %[[VAL_0:.*]]: !fir.boxchar<1> 87ad4e1abaSjeanPerier! CHECK: %[[VAL_1:.*]]:2 = fir.unboxchar %[[VAL_0]] : (!fir.boxchar<1>) -> (!fir.ref<!fir.char<1,?>>, index) 88ad4e1abaSjeanPerier! CHECK: %[[VAL_2:.*]] = fir.declare %[[VAL_1]]#0 typeparams %[[VAL_1]]#1 89ad4e1abaSjeanPerier! CHECK: %[[VAL_3:.*]] = fir.emboxchar %[[VAL_2]], %[[VAL_1]]#1 : (!fir.ref<!fir.char<1,?>>, index) -> !fir.boxchar<1> 90ad4e1abaSjeanPerier! CHECK: %[[VAL_4:.*]] = fir.convert %[[VAL_2]] : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<!fir.char<1>> 91ad4e1abaSjeanPerier! CHECK: %[[VAL_5:.*]] = fir.load %[[VAL_4]] : !fir.ref<!fir.char<1>> 92ad4e1abaSjeanPerier! CHECK: fir.call @test_char_value(%[[VAL_5]]) {{.*}}: (!fir.char<1>) -> () 93ad4e1abaSjeanPerier! CHECK: return 94ad4e1abaSjeanPerier! CHECK: } 95ad4e1abaSjeanPeriersubroutine test_call_char_value(x) 96ad4e1abaSjeanPerier character(*) :: x 97ad4e1abaSjeanPerier interface 98ad4e1abaSjeanPerier subroutine test_char_value(x) bind(c) 99ad4e1abaSjeanPerier character(1), value :: x 100ad4e1abaSjeanPerier end 101ad4e1abaSjeanPerier end interface 102ad4e1abaSjeanPerier call test_char_value(x) 103ad4e1abaSjeanPerierend subroutine 104ad4e1abaSjeanPerier 105fe9409b9SPeixin Qiao! CHECK-LABEL: func.func @_QPtest_cptr_value( 106ad4e1abaSjeanPerier! CHECK-SAME: %[[VAL_0:.*]]: !fir.ref<i64> 107fe9409b9SPeixin Qiao! CHECK: %[[VAL_1:.*]] = fir.alloca !fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}> 108fe9409b9SPeixin Qiao! CHECK: %[[VAL_2:.*]] = fir.field_index __address, !fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}> 109fe9409b9SPeixin Qiao! CHECK: %[[VAL_3:.*]] = fir.coordinate_of %[[VAL_1]], %[[VAL_2]] : (!fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>>, !fir.field) -> !fir.ref<i64> 110fe9409b9SPeixin Qiao! CHECK: %[[VAL_4:.*]] = fir.convert %[[VAL_0]] : (!fir.ref<i64>) -> i64 111fe9409b9SPeixin Qiao! CHECK: fir.store %[[VAL_4]] to %[[VAL_3]] : !fir.ref<i64> 112ad4e1abaSjeanPerier! CHECK: %[[VAL_5:.*]] = fir.declare %[[VAL_1]] 113ad4e1abaSjeanPerier! CHECK: fir.call @_QPinternal_call5(%[[VAL_5]]) fastmath<contract> : (!fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>>) -> () 114fe9409b9SPeixin Qiao! CHECK: return 115fe9409b9SPeixin Qiao! CHECK: } 116fe9409b9SPeixin Qiao 117fe9409b9SPeixin Qiaosubroutine test_cptr_value(x) 118ad4e1abaSjeanPerier use iso_c_binding, only: c_ptr 119fe9409b9SPeixin Qiao type(c_ptr), value :: x 120fe9409b9SPeixin Qiao call internal_call5(x) 121fe9409b9SPeixin Qiaoend 122