1// RUN: tco %s | FileCheck %s 2 3// CHECK-LINE: define i64 @_QTtP.mem.size(i32 %0, i16 %1) 4func.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 8 // CHECK: ret i64 8 9 return %4 : index 10} 11// CHECK-LINE: define i64 @_QTtP.f1.size(i32 %0, i16 %1) 12func.func @_QTtP.f1.size(%0 : i32, %1 : i16) -> index { 13 %2 = arith.constant 4 : index 14 // CHECK: ret i64 4 15 return %2 : index 16} 17// CHECK-LINE: define i64 @_QTtP.f2.size(i32 %0, i16 %1) 18func.func @_QTtP.f2.size(%0 : i32, %1 : i16) -> index { 19 %2 = arith.constant 4 : index 20 // CHECK: ret i64 4 21 return %2 : index 22} 23// CHECK-LINE: define i32 @_QTtP.f1.offset(i32 %0, i16 %1) 24func.func @_QTtP.f1.offset(%0 : i32, %1 : i16) -> i32 { 25 %2 = arith.constant 0 : i32 26 // CHECK: ret i32 0 27 return %2 : i32 28} 29// CHECK-LINE: define i32 @_QTtP.f2.offset(i32 %0, i16 %1) 30func.func @_QTtP.f2.offset(%0 : i32, %1 : i16) -> i32 { 31 %2 = arith.constant 4 : i32 32 // CHECK: ret i32 4 33 return %2 : i32 34} 35 36// program p 37// type t(p1,p2) 38// integer, len :: p1 39// integer(kind=2), len :: p2 40// integer f1 41// real f2 42// end type t 43// type(t) var 44// var%f1 = 4 45// end program p 46 47// CHECK-LINE: define void @_QQmain(i32 %0, i16 %1) 48func.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> 56 return 57} 58 59// CHECK-LINE: define i64 @_QTt1P.mem.size(i32 %0, i32 %1) 60func.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 66 return %4 : index 67} 68// CHECK-LINE: define i64 @_QTt1P.f1.size(i32 %0, i32 %1) 69func.func @_QTt1P.f1.size(%0 : i32, %1 : i32) -> index { 70 %2 = fir.convert %0 : (i32) -> index 71 return %2 : index 72} 73// CHECK-LINE: define i64 @_QTt1P.f2.size(i32 %0, i32 %1) 74func.func @_QTt1P.f2.size(%0 : i32, %1 : i32) -> index { 75 %2 = fir.convert %1 : (i32) -> index 76 return %2 : index 77} 78// CHECK-LINE: define i32 @_QTt1P.f1.offset(i32 %0, i32 %1) 79func.func @_QTt1P.f1.offset(%0 : i32, %1 : i32) -> i32 { 80 %2 = arith.constant 0 : i32 81 return %2 : i32 82} 83// CHECK-LINE: define i32 @_QTt1P.f2.offset(i32 %0, i32 %1) 84func.func @_QTt1P.f2.offset(%0 : i32, %1 : i32) -> i32 { 85 return %0 : i32 86} 87// subroutine foo(i,j) 88// type t(p1,p2) 89// integer, len :: p1 90// integer, len :: p2 91// character(LEN=p1) :: f1 92// character(LEN=p2) :: f2 93// end type t 94// type(t(i,j)) var 95// call bar(var%f2) 96// end program p 97 98func.func private @bar(!fir.ref<!fir.char<1,?>>) 99 100// CHECK-LINE: define i8* @_QPfoo(i32 %0, i32 %1) 101func.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,?>>) -> () 109 return 110} 111