xref: /llvm-project/flang/test/Lower/io-statement-3.f90 (revision f35f863a88f83332bef9605ef4cfe4f05c066efb)
1d670e102SValentin Clement! Test lowering of IO read SIZE control-spec (12.6.2.15)
2*f35f863aSjeanPerier! RUN: bbc -emit-fir -hlfir=false -o - %s | FileCheck %s
3d670e102SValentin Clement
4d670e102SValentin Clement! CHECK-LABEL: func @_QPtest_read_size(
5d670e102SValentin Clement! CHECK-SAME: %[[sizeVar:[^:]+]]: !fir.ref<i32>{{[^,]*}},
6d670e102SValentin Clementsubroutine test_read_size(size, c1, c2, unit, stat)
7d670e102SValentin Clement  integer :: unit, size, stat
8d670e102SValentin Clement  character(*) :: c1, c2
9d670e102SValentin Clement  ! CHECK: %[[cookie:.*]] = fir.call @_FortranAioBeginExternalFormattedInput(
10d670e102SValentin Clement  ! CHECK: fir.call @_FortranAioEnableHandlers(
11d670e102SValentin Clement  ! CHECK: %[[ok1:.*]] = fir.call @_FortranAioSetAdvance(
12d670e102SValentin Clement  ! CHECK: fir.if %[[ok1]] {
13d670e102SValentin Clement  ! CHECK:   fir.if %[[ok1]] {
14d670e102SValentin Clement  ! CHECK:     %[[ok2:.*]] = fir.call @_FortranAioInputAscii(
15d670e102SValentin Clement  ! CHECK:     fir.if %[[ok2]] {
16d670e102SValentin Clement  ! CHECK:       fir.call @_FortranAioInputAscii(
17d670e102SValentin Clement  ! CHECK:     }
18d670e102SValentin Clement  ! CHECK:   }
19d670e102SValentin Clement  ! CHECK: }
204cc9437aSTom Eccles  ! CHECK: %[[sizeValue:.*]] = fir.call @_FortranAioGetSize(%[[cookie]]) {{.*}}: (!fir.ref<i8>) -> i64
21d670e102SValentin Clement  ! CHECK: %[[sizeCast:.*]] = fir.convert %[[sizeValue]] : (i64) -> i32
22d670e102SValentin Clement  ! CHECK: fir.store %[[sizeCast]] to %[[sizeVar]] : !fir.ref<i32>
234cc9437aSTom Eccles  ! CHECK: fir.call @_FortranAioEndIoStatement(%[[cookie]]) {{.*}}: (!fir.ref<i8>) -> i32
24d670e102SValentin Clement  READ(unit, '(A)', ADVANCE='NO', SIZE=size, IOSTAT=stat) c1, c2
25d670e102SValentin Clementend subroutine
26d670e102SValentin Clement
27d670e102SValentin Clement  ! CHECK: %[[unit:.*]] = fir.alloca i32 {bindc_name = "unit", uniq_name = "_QFEunit"}
28d670e102SValentin Clement  integer :: unit
29d670e102SValentin Clement  character(7) :: c1
30d670e102SValentin Clement  character(4) :: c2
31d670e102SValentin Clement  integer :: size = 0
32d670e102SValentin Clement  integer :: stat = 0
334cc9437aSTom Eccles  ! CHECK: %[[cookie:.*]] = fir.call @_FortranAioBeginOpenNewUnit(%{{.*}}, %{{.*}}) {{.*}}: (!fir.ref<i8>, i32) -> !fir.ref<i8>
344cc9437aSTom Eccles  ! CHECK: fir.call @_FortranAioSetAccess(%[[cookie]], %{{.*}}, %{{.*}}) {{.*}}: (!fir.ref<i8>, !fir.ref<i8>, i64) -> i1
354cc9437aSTom Eccles  ! CHECK: fir.call @_FortranAioSetAction(%[[cookie]], %{{.*}}, %{{.*}}) {{.*}}: (!fir.ref<i8>, !fir.ref<i8>, i64) -> i1
364cc9437aSTom Eccles  ! CHECK: fir.call @_FortranAioSetForm(%[[cookie]], %{{.*}}, %{{.*}}) {{.*}}: (!fir.ref<i8>, !fir.ref<i8>, i64) -> i1
374cc9437aSTom Eccles  ! CHECK: fir.call @_FortranAioSetStatus(%[[cookie]], %{{.*}}, %{{.*}}) {{.*}}: (!fir.ref<i8>, !fir.ref<i8>, i64) -> i1
38d670e102SValentin Clement  ! CHECK: %[[kind:.*]] = arith.constant 4 : i32
394cc9437aSTom Eccles  ! CHECK: fir.call @_FortranAioGetNewUnit(%[[cookie]], %[[unit]], %[[kind]]) {{.*}}: (!fir.ref<i8>, !fir.ref<i32>, i32) -> i1
404cc9437aSTom Eccles  ! CHECK: fir.call @_FortranAioEndIoStatement(%[[cookie]]) {{.*}}: (!fir.ref<i8>) -> i32
41d670e102SValentin Clement  OPEN(NEWUNIT=unit,ACCESS='SEQUENTIAL',ACTION='READWRITE',&
42d670e102SValentin Clement    FORM='FORMATTED',STATUS='SCRATCH')
43d670e102SValentin Clement  WRITE(unit, '(A)') "ABCDEF"
44d670e102SValentin Clement  WRITE(unit, '(A)') "GHIJKL"
45d670e102SValentin Clement  REWIND(unit)
46d670e102SValentin Clement  call test_read_size(size, c1, c2, unit, stat)
47d670e102SValentin Clement  print *, stat, size, c1
48d670e102SValentin Clement  CLOSE(unit)
49d670e102SValentin Clementend
50