1 // RUN: tco %s | FileCheck %s
3 // CHECK-LINE: define i64 @_QTtP.mem.size(i32 %0, i16 %1)
4 func.func @_QTtP.mem.size(%0 : i32, %1 : i16) -> index {
5 %2 = call @_QTtP.f1.size(%0, %1) : (i32, i16) -> index
6 %3 = call @_QTtP.f2.size(%0, %1) : (i32, i16) -> index
7 %4 = arith.addi %2, %3 : index
11 // CHECK-LINE: define i64 @_QTtP.f1.size(i32 %0, i16 %1)
12 func.func @_QTtP.f1.size(%0 : i32, %1 : i16) -> index {
13 %2 = arith.constant 4 : index
17 // CHECK-LINE: define i64 @_QTtP.f2.size(i32 %0, i16 %1)
18 func.func @_QTtP.f2.size(%0 : i32, %1 : i16) -> index {
19 %2 = arith.constant 4 : index
23 // CHECK-LINE: define i32 @_QTtP.f1.offset(i32 %0, i16 %1)
24 func.func @_QTtP.f1.offset(%0 : i32, %1 : i16) -> i32 {
25 %2 = arith.constant 0 : i32
29 // CHECK-LINE: define i32 @_QTtP.f2.offset(i32 %0, i16 %1)
30 func.func @_QTtP.f2.offset(%0 : i32, %1 : i16) -> i32 {
31 %2 = arith.constant 4 : i32
39 // integer(kind=2), len :: p2
47 // CHECK-LINE: define void @_QQmain(i32 %0, i16 %1)
48 func.func @_QQmain(%arg0 : i32, %arg1 : i16) {
49 // CHECK: %[[size:.*]] = call i64 @_QTtP.mem.size(i32 %0, i16 %1)
50 // CHECK: %[[alloc:.*]] = alloca i8, i64 %[[size]]
51 %0 = fir.alloca !fir.type<_QTt(p1:i32,p2:i16){f1:i32,f2:f32}>(%arg0, %arg1 : i32, i16) {name = "_QEvar"}
52 %1 = fir.field_index f1, !fir.type<_QTt(p1:i32,p2:i16){f1:i32,f2:f32}>(%arg0, %arg1 : i32, i16)
53 %2 = fir.coordinate_of %0, %1 : (!fir.ref<!fir.type<_QTt(p1:i32,p2:i16){f1:i32,f2:f32}>>, !fir.field) -> !fir.ref<i32>
54 %c4_i32 = arith.constant 4 : i32
55 fir.store %c4_i32 to %2 : !fir.ref<i32>
59 // CHECK-LINE: define i64 @_QTt1P.mem.size(i32 %0, i32 %1)
60 func.func @_QTt1P.mem.size(%0 : i32, %1 : i32) -> index {
61 // CHECK: call i64 @_QTt1P.f1.size
62 %2 = call @_QTt1P.f1.size(%0, %1) : (i32, i32) -> index
63 // CHECK: call i64 @_QTt1P.f2.size
64 %3 = call @_QTt1P.f2.size(%0, %1) : (i32, i32) -> index
65 %4 = arith.addi %2, %3 : index
68 // CHECK-LINE: define i64 @_QTt1P.f1.size(i32 %0, i32 %1)
69 func.func @_QTt1P.f1.size(%0 : i32, %1 : i32) -> index {
70 %2 = fir.convert %0 : (i32) -> index
73 // CHECK-LINE: define i64 @_QTt1P.f2.size(i32 %0, i32 %1)
74 func.func @_QTt1P.f2.size(%0 : i32, %1 : i32) -> index {
75 %2 = fir.convert %1 : (i32) -> index
78 // CHECK-LINE: define i32 @_QTt1P.f1.offset(i32 %0, i32 %1)
79 func.func @_QTt1P.f1.offset(%0 : i32, %1 : i32) -> i32 {
80 %2 = arith.constant 0 : i32
83 // CHECK-LINE: define i32 @_QTt1P.f2.offset(i32 %0, i32 %1)
84 func.func @_QTt1P.f2.offset(%0 : i32, %1 : i32) -> i32 {
87 // subroutine foo(i,j)
91 // character(LEN=p1) :: f1
92 // character(LEN=p2) :: f2
98 func.func private @bar(!fir.ref<!fir.char<1,?>>)
100 // CHECK-LINE: define i8* @_QPfoo(i32 %0, i32 %1)
101 func.func @_QPfoo(%arg0 : i32, %arg1 : i32) {
102 // CHECK: %[[size:.*]] = call i64 @_QTt1P.mem.size(i32 %0, i32 %1)
103 // CHECK: %[[alloc:.*]] = alloca i8, i64 %[[size]]
104 %0 = fir.alloca !fir.type<_QTt1(p1:i32,p2:i32){f1:!fir.char<1,?>,f2:!fir.char<1,?>}>(%arg0, %arg1 : i32, i32)
105 %1 = fir.field_index f2, !fir.type<_QTt1>(%arg0, %arg1 : i32, i32)
106 //%2 = fir.coordinate_of %0, %1 : (!fir.ref<!fir.type<_QTt1>>, !fir.field) -> !fir.ref<!fir.char<1,?>>
107 %2 = fir.zero_bits !fir.ref<!fir.char<1,?>>
108 fir.call @bar(%2) : (!fir.ref<!fir.char<1,?>>) -> ()