Break circular dependency between FIR dialect and utilities
[llvm-project.git] / flang / test / Fir / pdt.fir
blob4464b897414a153a4d169495d56e981025d99e8b
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
8   // CHECK: ret i64 8
9   return %4 : 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
14   // CHECK: ret i64 4
15   return %2 : 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
20   // CHECK: ret i64 4
21   return %2 : 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
26   // CHECK: ret i32 0
27   return %2 : 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
32   // CHECK: ret i32 4
33   return %2 : i32
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
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>
56   return
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
66   return %4 : 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
71   return %2 : 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
76   return %2 : 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
81   return %2 : i32
83 // CHECK-LINE: define i32 @_QTt1P.f2.offset(i32 %0, i32 %1)
84 func.func @_QTt1P.f2.offset(%0 : i32, %1 : i32) -> i32 {
85   return %0 : i32
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
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,?>>) -> ()
109   return