1
1
! Test for PassBy::Value
2
- ! RUN: bbc -emit-fir -hlfir=false %s -o - | FileCheck %s
2
+ ! RUN: bbc -emit-fir %s -o - | FileCheck %s
3
3
4
4
! CHECK-LABEL: func @_QQmain()
5
- ! CHECK: %[[LOGICAL:.*]] = fir.alloca !fir.logical<1>
6
5
! CHECK: %false = arith.constant false
6
+ ! CHECK: %[[LOGICAL_ALLOC:.*]] = fir.alloca !fir.logical<1>
7
+ ! CHECK: %[[LOGICAL:.*]] = fir.declare %[[LOGICAL_ALLOC]]
7
8
! CHECK: %[[VALUE:.*]] = fir.convert %false : (i1) -> !fir.logical<1>
8
9
! CHECK: fir.store %[[VALUE]] to %[[LOGICAL]]
9
10
! CHECK: %[[LOAD:.*]] = fir.load %[[LOGICAL]]
@@ -23,52 +24,56 @@ end subroutine omp_set_nested
23
24
call omp_set_nested(do_nested)
24
25
end program call_by_value
25
26
26
- ! CHECK-LABEL: func.func @test_integer_value(
27
- ! CHECK-SAME: %[[VAL_0:.*]]: i32 {fir.bindc_name = "x"}) attributes {fir.bindc_name = "test_integer_value"} {
28
- ! CHECK: %[[VAL_1:.*]] = fir.alloca i32
29
- ! CHECK: fir.store %[[VAL_0]] to %[[VAL_1]] : !fir.ref<i32>
30
- ! CHECK: fir.call @_QPinternal_call(%[[VAL_1]]) {{.*}}: (!fir.ref<i32>) -> ()
31
- ! CHECK: return
32
- ! CHECK: }
27
+ ! CHECK-LABEL: func.func @test_integer_value(
28
+ ! CHECK-SAME: %[[VAL_0:.*]]: i32
29
+ ! CHECK: %[[VAL_1:.*]] = fir.alloca i32
30
+ ! CHECK: fir.store %[[VAL_0]] to %[[VAL_1]] : !fir.ref<i32>
31
+ ! CHECK: %[[VAL_2:.*]] = fir.declare %[[VAL_1]]
32
+ ! CHECK: fir.call @_QPinternal_call(%[[VAL_2]]) {{.*}}: (!fir.ref<i32>) -> ()
33
+ ! CHECK: return
34
+ ! CHECK: }
33
35
34
36
subroutine test_integer_value (x ) bind(c)
35
37
integer , value :: x
36
38
call internal_call(x)
37
39
end
40
+ ! CHECK-LABEL: func.func @test_real_value(
41
+ ! CHECK-SAME: %[[VAL_0:.*]]: f32
42
+ ! CHECK: %[[VAL_1:.*]] = fir.alloca f32
43
+ ! CHECK: fir.store %[[VAL_0]] to %[[VAL_1]] : !fir.ref<f32>
44
+ ! CHECK: %[[VAL_2:.*]] = fir.declare %[[VAL_1]]
45
+ ! CHECK: fir.call @_QPinternal_call2(%[[VAL_2]]) {{.*}}: (!fir.ref<f32>) -> ()
46
+ ! CHECK: return
47
+ ! CHECK: }
38
48
39
- ! CHECK-LABEL: func.func @test_real_value(
40
- ! CHECK-SAME: %[[VAL_0:.*]]: f32 {fir.bindc_name = "x"}) attributes {fir.bindc_name = "test_real_value"} {
41
- ! CHECK: %[[VAL_1:.*]] = fir.alloca f32
42
- ! CHECK: fir.store %[[VAL_0]] to %[[VAL_1]] : !fir.ref<f32>
43
- ! CHECK: fir.call @_QPinternal_call2(%[[VAL_1]]) {{.*}}: (!fir.ref<f32>) -> ()
44
- ! CHECK: return
45
- ! CHECK: }
46
49
47
50
subroutine test_real_value (x ) bind(c)
48
51
real , value :: x
49
52
call internal_call2(x)
50
53
end
54
+ ! CHECK-LABEL: func.func @test_complex_value(
55
+ ! CHECK-SAME: %[[VAL_0:.*]]: !fir.complex<4>
56
+ ! CHECK: %[[VAL_1:.*]] = fir.alloca !fir.complex<4>
57
+ ! CHECK: fir.store %[[VAL_0]] to %[[VAL_1]] : !fir.ref<!fir.complex<4>>
58
+ ! CHECK: %[[VAL_2:.*]] = fir.declare %[[VAL_1]]
59
+ ! CHECK: fir.call @_QPinternal_call3(%[[VAL_2]]) {{.*}}: (!fir.ref<!fir.complex<4>>) -> ()
60
+ ! CHECK: return
61
+ ! CHECK: }
51
62
52
- ! CHECK-LABEL: func.func @test_complex_value(
53
- ! CHECK-SAME: %[[VAL_0:.*]]: !fir.complex<4> {fir.bindc_name = "x"}) attributes {fir.bindc_name = "test_complex_value"} {
54
- ! CHECK: %[[VAL_1:.*]] = fir.alloca !fir.complex<4>
55
- ! CHECK: fir.store %[[VAL_0]] to %[[VAL_1]] : !fir.ref<!fir.complex<4>>
56
- ! CHECK: fir.call @_QPinternal_call3(%[[VAL_1]]) {{.*}}: (!fir.ref<!fir.complex<4>>) -> ()
57
- ! CHECK: return
58
- ! CHECK: }
59
63
60
64
subroutine test_complex_value (x ) bind(c)
61
65
complex , value :: x
62
66
call internal_call3(x)
63
67
end
64
68
65
69
! CHECK-LABEL: func.func @test_char_value(
66
- ! CHECK-SAME: %[[VAL_0:.*]]: !fir.boxchar<1> {fir.bindc_name = "x"}) attributes {fir.bindc_name = "test_char_value"} {
67
- ! CHECK: %[[VAL_1:.*]]:2 = fir.unboxchar %[[VAL_0]] : (!fir.boxchar<1>) -> (!fir.ref<!fir.char<1,?>>, index)
68
- ! CHECK: %[[VAL_3:.*]] = fir.convert %[[VAL_1]]#0 : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<!fir.char<1>>
69
- ! CHECK: %[[VAL_2:.*]] = arith.constant 1 : index
70
- ! CHECK: %[[VAL_5:.*]] = fir.emboxchar %[[VAL_3]], %[[VAL_2]] : (!fir.ref<!fir.char<1>>, index) -> !fir.boxchar<1>
71
- ! CHECK: fir.call @_QPinternal_call4(%[[VAL_5]]) fastmath<contract> : (!fir.boxchar<1>) -> ()
70
+ ! CHECK-SAME: %[[VAL_0:.*]]: !fir.char<1>
71
+ ! CHECK: %[[VAL_1:.*]] = arith.constant 1 : index
72
+ ! CHECK: %[[VAL_2:.*]] = fir.alloca !fir.char<1>
73
+ ! CHECK: fir.store %[[VAL_0]] to %[[VAL_2]] : !fir.ref<!fir.char<1>>
74
+ ! CHECK: %[[VAL_3:.*]] = fir.declare %[[VAL_2]] typeparams %[[VAL_1]]
75
+ ! CHECK: %[[VAL_4:.*]] = fir.emboxchar %[[VAL_3]], %[[VAL_1]] : (!fir.ref<!fir.char<1>>, index) -> !fir.boxchar<1>
76
+ ! CHECK: fir.call @_QPinternal_call4(%[[VAL_4]]) {{.*}}: (!fir.boxchar<1>) -> ()
72
77
! CHECK: return
73
78
! CHECK: }
74
79
@@ -77,19 +82,40 @@ subroutine test_char_value(x) bind(c)
77
82
call internal_call4(x)
78
83
end
79
84
80
- ! CHECK-LABEL: func.func @_QPtest_cptr_value(
81
- ! CHECK-SAME: %[[VAL_0:.*]]: !fir.ref<i64> {fir.bindc_name = "x"}) {
82
- ! CHECK: %[[VAL_1:.*]] = fir.alloca !fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>
83
- ! CHECK: %[[VAL_2:.*]] = fir.field_index __address, !fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>
84
- ! 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>
85
- ! CHECK: %[[VAL_4:.*]] = fir.convert %[[VAL_0]] : (!fir.ref<i64>) -> i64
86
- ! CHECK: fir.store %[[VAL_4]] to %[[VAL_3]] : !fir.ref<i64>
87
- ! CHECK: fir.call @_QPinternal_call5(%[[VAL_1]]) {{.*}}: (!fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>>) -> ()
88
- ! CHECK: return
89
- ! CHECK: }
85
+ ! CHECK-LABEL: func.func @_QPtest_call_char_value(
86
+ ! CHECK-SAME: %[[VAL_0:.*]]: !fir.boxchar<1>
87
+ ! CHECK: %[[VAL_1:.*]]:2 = fir.unboxchar %[[VAL_0]] : (!fir.boxchar<1>) -> (!fir.ref<!fir.char<1,?>>, index)
88
+ ! CHECK: %[[VAL_2:.*]] = fir.declare %[[VAL_1]]#0 typeparams %[[VAL_1]]#1
89
+ ! CHECK: %[[VAL_3:.*]] = fir.emboxchar %[[VAL_2]], %[[VAL_1]]#1 : (!fir.ref<!fir.char<1,?>>, index) -> !fir.boxchar<1>
90
+ ! CHECK: %[[VAL_4:.*]] = fir.convert %[[VAL_2]] : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<!fir.char<1>>
91
+ ! CHECK: %[[VAL_5:.*]] = fir.load %[[VAL_4]] : !fir.ref<!fir.char<1>>
92
+ ! CHECK: fir.call @test_char_value(%[[VAL_5]]) {{.*}}: (!fir.char<1>) -> ()
93
+ ! CHECK: return
94
+ ! CHECK: }
95
+ subroutine test_call_char_value (x )
96
+ character (* ) :: x
97
+ interface
98
+ subroutine test_char_value (x ) bind(c)
99
+ character (1 ), value :: x
100
+ end
101
+ end interface
102
+ call test_char_value(x)
103
+ end subroutine
104
+
105
+ ! CHECK-LABEL: func.func @_QPtest_cptr_value(
106
+ ! CHECK-SAME: %[[VAL_0:.*]]: !fir.ref<i64>
107
+ ! CHECK: %[[VAL_1:.*]] = fir.alloca !fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>
108
+ ! CHECK: %[[VAL_2:.*]] = fir.field_index __address, !fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>
109
+ ! 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>
110
+ ! CHECK: %[[VAL_4:.*]] = fir.convert %[[VAL_0]] : (!fir.ref<i64>) -> i64
111
+ ! CHECK: fir.store %[[VAL_4]] to %[[VAL_3]] : !fir.ref<i64>
112
+ ! CHECK: %[[VAL_5:.*]] = fir.declare %[[VAL_1]]
113
+ ! CHECK: fir.call @_QPinternal_call5(%[[VAL_5]]) fastmath<contract> : (!fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>>) -> ()
114
+ ! CHECK: return
115
+ ! CHECK: }
90
116
91
117
subroutine test_cptr_value (x )
92
- use iso_c_binding
118
+ use iso_c_binding, only: c_ptr
93
119
type (c_ptr), value :: x
94
120
call internal_call5(x)
95
121
end
0 commit comments