[flang] Accept polymorphic component element in storage_size
[llvm-project.git] / flang / test / Fir / fir-types.fir
blob7f9c079f1451f81ab18dae51441e4222ed726225
1 // Test the FIR types
2 // Parse types and check that we can reparse what we print.
3 // RUN: fir-opt --split-input-file %s | fir-opt --split-input-file | FileCheck %s
5 // Fortran Intrinsic types
6 // CHECK-LABEL: func private @it1() -> !fir.int<4>
7 // CHECK-LABEL: func private @it2() -> !fir.real<8>
8 // CHECK-LABEL: func private @it3() -> !fir.complex<8>
9 // CHECK-LABEL: func private @it4() -> !fir.logical<1>
10 // CHECK-LABEL: func private @it5() -> !fir.char<1>
11 // CHECK-LABEL: func private @it6() -> !fir.char<2,10>
12 // CHECK-LABEL: func private @it7() -> !fir.char<4,?>
13 func.func private @it1() -> !fir.int<4>
14 func.func private @it2() -> !fir.real<8>
15 func.func private @it3() -> !fir.complex<8>
16 func.func private @it4() -> !fir.logical<1>
17 func.func private @it5() -> !fir.char<1>
18 func.func private @it6() -> !fir.char<2,10>
19 func.func private @it7() -> !fir.char<4,?>
21 // -----
23 // Fortran Derived types (records)
24 // CHECK-LABEL: func private @dvd1() -> !fir.type<derived1>
25 // CHECK-LABEL: func private @dvd2() -> !fir.type<derived2(p:i32)>
26 // CHECK-LABEL: func private @dvd3() -> !fir.type<derived3{f:f32}>
27 // CHECK-LABEL: func private @dvd4() -> !fir.type<derived4(p:i8){f:f32}>
28 // CHECK-LABEL: func private @dvd5() -> !fir.type<derived5(p1:i8,p2:i8,p3:i8,p4:i8,p5:i8){f1:f32,f2:f32,f3:f32,f4:f32,f5:f32,f6:f32,f7:f32,f8:f32}>
29 // CHECK-LABEL: func private @dvd6() -> !fir.type<derived6{f:!fir.ptr<!fir.type<derived6>>}>
30 // CHECK-LABEL: func private @dvd7() -> !fir.type<derived_with_field_name_same_as_integer_type{i32:f32}>
31 func.func private @dvd1() -> !fir.type<derived1>
32 func.func private @dvd2() -> !fir.type<derived2(p:i32)>
33 func.func private @dvd3() -> !fir.type<derived3{f:f32}>
34 func.func private @dvd4() -> !fir.type<derived4(p:i8){f:f32}>
35 func.func private @dvd5() -> !fir.type<derived5(p1:i8,p2:i8,p3:i8,p4:i8,p5:i8){f1:f32,f2:f32,f3:f32,f4:f32,f5:f32,f6:f32,f7:f32,f8:f32}>
36 func.func private @dvd6() -> !fir.type<derived6{f:!fir.ptr<!fir.type<derived6>>}>
37 func.func private @dvd7() -> !fir.type<derived_with_field_name_same_as_integer_type{i32:f32}>
39 // -----
41 // FIR array types
42 // CHECK-LABEL: func private @arr1() -> !fir.array<10xf32>
43 // CHECK-LABEL: func private @arr2() -> !fir.array<10x10xf32>
44 // CHECK-LABEL: func private @arr3() -> !fir.array<?xf32>
45 // CHECK-LABEL: func private @arr4() -> !fir.array<10x?xf32>
46 // CHECK-LABEL: func private @arr5() -> !fir.array<?x?xf32>
47 // CHECK-LABEL: func private @arr6() -> !fir.array<*:f32>
48 // CHECK-LABEL: func private @arr7() -> !fir.array<1x2x?x4x5x6x7x8x9xf32>
49 func.func private @arr1() -> !fir.array<10xf32>
50 func.func private @arr2() -> !fir.array<10x10xf32>
51 func.func private @arr3() -> !fir.array<?xf32>
52 func.func private @arr4() -> !fir.array<10x?xf32>
53 func.func private @arr5() -> !fir.array<?x?xf32>
54 func.func private @arr6() -> !fir.array<*:f32>
55 func.func private @arr7() -> !fir.array<1x2x?x4x5x6x7x8x9xf32>
57 // -----
59 // FIR pointer-like types
60 // CHECK-LABEL: func private @mem1() -> !fir.ref<i32>
61 // CHECK-LABEL: func private @mem2() -> !fir.ptr<i32>
62 // CHECK-LABEL: func private @mem3() -> !fir.heap<i32>
63 // CHECK-LABEL: func private @mem4() -> !fir.ref<() -> ()>
64 // CHECK-LABEL: func private @mem5() -> !fir.llvm_ptr<!fir.ref<f32>>
65 // CHECK-LABEL: func private @mem6() -> !fir.llvm_ptr<i8>
66 func.func private @mem1() -> !fir.ref<i32>
67 func.func private @mem2() -> !fir.ptr<i32>
68 func.func private @mem3() -> !fir.heap<i32>
69 func.func private @mem4() -> !fir.ref<() -> ()>
70 func.func private @mem5() -> !fir.llvm_ptr<!fir.ref<f32>>
71 func.func private @mem6() -> !fir.llvm_ptr<i8>
73 // -----
75 // FIR box types (descriptors)
76 // CHECK-LABEL: func private @box1() -> !fir.box<!fir.array<?xf32>>
77 // CHECK-LABEL: func private @box2() -> !fir.boxchar<2>
78 // CHECK-LABEL: func private @box3() -> !fir.boxproc<(i32, i32) -> i64>
79 // CHECK-LABEL: func private @box4() -> !fir.box<none>
80 // CHECK-LABEL: func private @box5() -> !fir.box<!fir.type<derived3{f:f32}>>
81 func.func private @box1() -> !fir.box<!fir.array<?xf32>>
82 func.func private @box2() -> !fir.boxchar<2>
83 func.func private @box3() -> !fir.boxproc<(i32, i32) -> i64>
84 func.func private @box4() -> !fir.box<none>
85 func.func private @box5() -> !fir.box<!fir.type<derived3{f:f32}>>
87 // -----
89 // FIR misc. types
90 // CHECK-LABEL: func private @oth1() -> !fir.shape<1>
91 // CHECK-LABEL: func private @oth2() -> !fir.field
92 // CHECK-LABEL: func private @oth3() -> !fir.tdesc<!fir.type<derived7{f1:f32,f2:f32}>>
93 // CHECK-LABEL: func private @oth4() -> !fir.shapeshift<15>
94 // CHECK-LABEL: func private @oth5() -> !fir.slice<8>
95 func.func private @oth1() -> !fir.shape<1>
96 func.func private @oth2() -> !fir.field
97 func.func private @oth3() -> !fir.tdesc<!fir.type<derived7{f1:f32,f2:f32}>>
98 func.func private @oth4() -> !fir.shapeshift<15>
99 func.func private @oth5() -> !fir.slice<8>
101 // -----
103 // FIR vector
104 // CHECK-LABEL: func private @vecty(i1) -> !fir.vector<10:i32>
105 func.func private @vecty(i1) -> !fir.vector<10:i32>
107 // -----
109 // FIR Class type
110 // CHECK-LABEL: class1() -> !fir.class<!fir.type<c1{p:i32}>>
111 // CHECK-LABEL: class2() -> !fir.class<!fir.array<?x!fir.type<c1{p:i32}>>>
112 // CHECK-LABEL: class3() -> !fir.class<!fir.heap<!fir.type<c1{p:i32}>>>
113 // CHECK-LABEL: class4() -> !fir.class<!fir.ptr<!fir.type<c1{p:i32}>>>
114 // CHECK-LABEL: class5() -> !fir.class<none>
115 // CHECK-LABEL: class6() -> !fir.class<!fir.array<?xnone>>
116 // CHECK-LABEL: class7() -> !fir.class<!fir.heap<none>>
117 // CHECK-LABEL: class8() -> !fir.class<!fir.ptr<none>>
118 func.func private @class1() -> !fir.class<!fir.type<c1{p:i32}>>
119 func.func private @class2() -> !fir.class<!fir.array<?x!fir.type<c1{p:i32}>>>
120 func.func private @class3() -> !fir.class<!fir.heap<!fir.type<c1{p:i32}>>>
121 func.func private @class4() -> !fir.class<!fir.ptr<!fir.type<c1{p:i32}>>>
122 func.func private @class5() -> !fir.class<none>
123 func.func private @class6() -> !fir.class<!fir.array<?xnone>>
124 func.func private @class7() -> !fir.class<!fir.heap<none>>
125 func.func private @class8() -> !fir.class<!fir.ptr<none>>