xref: /llvm-project/flang/test/Lower/io-statement-1.f90 (revision 4679132a85c6c4cced2a71ef6422b793ae39598c)
1! RUN: bbc %s -emit-fir -hlfir=false -o - | FileCheck %s
2! UNSUPPORTED: system-windows
3
4 logical :: existsvar
5 integer :: length
6 real :: a(100)
7
8  ! CHECK-LABEL: _QQmain
9  ! CHECK: call {{.*}}BeginOpenUnit
10  ! CHECK-DAG: call {{.*}}SetFile
11  ! CHECK-DAG: call {{.*}}SetAccess
12  ! CHECK: call {{.*}}EndIoStatement
13  open(8, file="foo", access="sequential")
14
15  ! CHECK: call {{.*}}BeginBackspace
16  ! CHECK: call {{.*}}EndIoStatement
17  backspace(8)
18
19  ! CHECK: call {{.*}}BeginFlush
20  ! CHECK: call {{.*}}EndIoStatement
21  flush(8)
22
23  ! CHECK: call {{.*}}BeginRewind
24  ! CHECK: call {{.*}}EndIoStatement
25  rewind(8)
26
27  ! CHECK: call {{.*}}BeginEndfile
28  ! CHECK: call {{.*}}EndIoStatement
29  endfile(8)
30
31  ! CHECK: call {{.*}}BeginWaitAll(%{{.*}}, %{{.*}}, %{{.*}})
32  ! CHECK: call {{.*}}EndIoStatement
33  wait(unit=8)
34
35  ! CHECK: call {{.*}}BeginExternalListInput
36  ! CHECK: call {{.*}}InputInteger
37  ! CHECK: call {{.*}}InputReal32
38  ! CHECK: call {{.*}}EndIoStatement
39  read (8,*) i, f
40
41  ! CHECK: call {{.*}}BeginExternalListOutput
42  ! CHECK: call {{.*}}OutputInteger32
43  ! CHECK: call {{.*}}OutputReal32
44  ! CHECK: call {{.*}}EndIoStatement
45  write (8,*) i, f
46
47  ! CHECK: call {{.*}}BeginClose
48  ! CHECK: call {{.*}}EndIoStatement
49  close(8)
50
51  ! CHECK: call {{.*}}BeginExternalListOutput
52  ! CHECK: call {{.*}}OutputAscii
53  ! CHECK: call {{.*}}EndIoStatement
54  print *, "A literal string"
55
56  ! CHECK: call {{.*}}BeginInquireUnit
57  ! CHECK: call {{.*}}EndIoStatement
58  inquire(4, EXIST=existsvar)
59
60  ! CHECK: call {{.*}}BeginInquireFile
61  ! CHECK: call {{.*}}EndIoStatement
62  inquire(FILE="fail.f90", EXIST=existsvar)
63
64  ! CHECK: call {{.*}}BeginInquireIoLength
65  ! CHECK-COUNT-3: call {{.*}}OutputDescriptor
66  ! CHECK: call {{.*}}EndIoStatement
67  inquire (iolength=length) existsvar, length, a
68end
69
70! CHECK-LABEL: internalnamelistio
71subroutine internalNamelistIO()
72  ! CHECK: %[[internal:[0-9]+]] = fir.alloca !fir.char<1,12> {bindc_name = "internal"
73  character(12) :: internal
74  integer :: x = 123
75  namelist /nml/x
76  ! CHECK: %[[internal_:[0-9]+]] = fir.convert %[[internal]] : (!fir.ref<!fir.char<1,12>>) -> !fir.ref<i8>
77  ! CHECK: %[[cookie:[0-9]+]] = fir.call @_FortranAioBeginInternalListOutput(%[[internal_]]
78  ! CHECK: fir.call @_FortranAioOutputNamelist(%[[cookie]]
79  ! CHECK: fir.call @_FortranAioEndIoStatement(%[[cookie]]
80  write(internal,nml=nml)
81end
82
83! Tests the 4 basic inquire formats
84! CHECK-LABEL: func @_QPinquire_test
85subroutine inquire_test(ch, i, b)
86  character(80) :: ch
87  integer :: i
88  logical :: b
89  integer :: id_func
90
91  ! CHARACTER
92  ! CHECK: %[[sugar:.*]] = fir.call {{.*}}BeginInquireUnit
93  ! CHECK: call {{.*}}InquireCharacter(%[[sugar]], %c{{.*}}, %{{.*}}, %{{.*}}) {{.*}}: (!fir.ref<i8>, i64, !fir.ref<i8>, i64) -> i1
94  ! CHECK: call {{.*}}EndIoStatement
95  inquire(88, name=ch)
96
97  ! INTEGER
98  ! CHECK: %[[oatmeal:.*]] = fir.call {{.*}}BeginInquireUnit
99  ! CHECK: call @_FortranAioInquireInteger64(%[[oatmeal]], %c{{.*}}, %{{.*}}, %{{.*}}) {{.*}}: (!fir.ref<i8>, i64, !fir.ref<i64>, i32) -> i1
100  ! CHECK: call {{.*}}EndIoStatement
101  inquire(89, pos=i)
102
103  ! LOGICAL
104  ! CHECK: %[[snicker:.*]] = fir.call {{.*}}BeginInquireUnit
105  ! CHECK: call @_FortranAioInquireLogical(%[[snicker]], %c{{.*}}, %[[b:.*]]) {{.*}}: (!fir.ref<i8>, i64, !fir.ref<i1>) -> i1
106  ! CHECK: call {{.*}}EndIoStatement
107  inquire(90, opened=b)
108
109  ! PENDING with ID
110  ! CHECK-DAG: %[[chip:.*]] = fir.call {{.*}}BeginInquireUnit
111  ! CHECK-DAG: fir.call @_QPid_func
112  ! CHECK: call @_FortranAioInquirePendingId(%[[chip]], %{{.*}}, %{{.*}}) {{.*}}: (!fir.ref<i8>, i32, !fir.ref<i1>) -> i1
113  ! CHECK: call {{.*}}EndIoStatement
114  inquire(91, id=id_func(), pending=b)
115end subroutine inquire_test
116
117! CHECK-LABEL: @_QPboz
118subroutine boz
119  ! CHECK: fir.call @_FortranAioOutputInteger8(%{{.*}}, %{{.*}}) {{.*}}: (!fir.ref<i8>, i8) -> i1
120  ! CHECK: fir.call @_FortranAioOutputInteger16(%{{.*}}, %{{.*}}) {{.*}}: (!fir.ref<i8>, i16) -> i1
121  ! CHECK: fir.call @_FortranAioOutputInteger32(%{{.*}}, %{{.*}}) {{.*}}: (!fir.ref<i8>, i32) -> i1
122  ! CHECK: fir.call @_FortranAioOutputInteger64(%{{.*}}, %{{.*}}) {{.*}}: (!fir.ref<i8>, i64) -> i1
123  ! CHECK: fir.call @_FortranAioOutputInteger128(%{{.*}}, %{{.*}}) {{.*}}: (!fir.ref<i8>, i128) -> i1
124  print '(*(Z3))', 96_1, 96_2, 96_4, 96_8, 96_16
125
126  ! CHECK: fir.call @_FortranAioOutputInteger32(%{{.*}}, %{{.*}}) {{.*}}: (!fir.ref<i8>, i32) -> i1
127  ! CHECK: fir.call @_FortranAioOutputInteger64(%{{.*}}, %{{.*}}) {{.*}}: (!fir.ref<i8>, i64) -> i1
128  ! CHECK: fir.call @_FortranAioOutputInteger64(%{{.*}}, %{{.*}}) {{.*}}: (!fir.ref<i8>, i64) -> i1
129  print '(I3,2Z44)', 40, 2**40_8, 2**40_8+1
130
131  ! CHECK: fir.call @_FortranAioOutputInteger32(%{{.*}}, %{{.*}}) {{.*}}: (!fir.ref<i8>, i32) -> i1
132  ! CHECK: fir.call @_FortranAioOutputInteger64(%{{.*}}, %{{.*}}) {{.*}}: (!fir.ref<i8>, i64) -> i1
133  ! CHECK: fir.call @_FortranAioOutputInteger64(%{{.*}}, %{{.*}}) {{.*}}: (!fir.ref<i8>, i64) -> i1
134  print '(I3,2I44)', 40, 1099511627776,  1099511627777
135
136  ! CHECK: fir.call @_FortranAioOutputInteger32(%{{.*}}, %{{.*}}) {{.*}}: (!fir.ref<i8>, i32) -> i1
137  ! CHECK: fir.call @_FortranAioOutputInteger64(%{{.*}}, %{{.*}}) {{.*}}: (!fir.ref<i8>, i64) -> i1
138  ! CHECK: fir.call @_FortranAioOutputInteger64(%{{.*}}, %{{.*}}) {{.*}}: (!fir.ref<i8>, i64) -> i1
139  print '(I3,2O44)', 40, 2**40_8, 2**40_8+1
140
141  ! CHECK: fir.call @_FortranAioOutputInteger32(%{{.*}}, %{{.*}}) {{.*}}: (!fir.ref<i8>, i32) -> i1
142  ! CHECK: fir.call @_FortranAioOutputInteger64(%{{.*}}, %{{.*}}) {{.*}}: (!fir.ref<i8>, i64) -> i1
143  ! CHECK: fir.call @_FortranAioOutputInteger64(%{{.*}}, %{{.*}}) {{.*}}: (!fir.ref<i8>, i64) -> i1
144  print '(I3,2B44)', 40, 2**40_8, 2**40_8+1
145end
146