llvm/flang/test/Lower/io-statement-2.f90

! RUN: bbc -emit-fir -hlfir=false -o - %s | FileCheck %s
! UNSUPPORTED: system-windows

   character*10 :: exx
   character*30 :: m
   integer*2 :: s
   exx = 'AA'
   m = 'CCCCCC'
   s = -13
   ! CHECK: call {{.*}}BeginExternalFormattedInput
   ! CHECK: call {{.*}}EnableHandlers
   ! CHECK: call {{.*}}SetAdvance
   ! CHECK: call {{.*}}InputReal
   ! CHECK: call {{.*}}GetIoMsg
   ! CHECK: call {{.*}}EndIoStatement
   ! CHECK: fir.select %{{.*}} : index [-2, ^bb4, -1, ^bb3, 0, ^bb1, unit, ^bb2]
   read(*, '(A)', ADVANCE='NO', ERR=10, END=20, EOR=30, IOSTAT=s, IOMSG=m) f
   ! CHECK-LABEL: ^bb1:
   exx = 'Zip'; goto 90
10 exx = 'Err'; goto 90
20 exx = 'End'; goto 90
30 exx = 'Eor'; goto 90
90 print*, exx, c, m, s
end

! CHECK-LABEL: func @_QPcontrol0
subroutine control0(n) ! no I/O condition specifier control flow
dimension c(n), d(n,n), e(n,n), f(n)
! CHECK-NOT: fir.if
! CHECK: BeginExternalFormattedInput
! CHECK-NOT: fir.if
! CHECK: SetAdvance
! CHECK-NOT: fir.if
! CHECK: InputReal32
! CHECK-NOT: fir.if
! CHECK: InputReal32
! CHECK-NOT: fir.if
! CHECK: fir.do_loop
! CHECK-NOT: fir.if
! CHECK: InputReal32
! CHECK-NOT: fir.if
! CHECK: fir.do_loop
! CHECK-NOT: fir.if
! CHECK: InputReal32
! CHECK-NOT: fir.if
! CHECK: InputReal32
! CHECK-NOT: fir.if
! CHECK: InputReal32
! CHECK-NOT: fir.if
! CHECK: InputReal32
! CHECK-NOT: fir.if
! CHECK: EndIoStatement
! CHECK-NOT: fir.if
read(*,'(F7.2)', advance='no') a, b, (c(j), (d(k,j), e(k,j), k=1,n), f(j), j=1,n), g
end

! CHECK-LABEL: func @_QPcontrol1
subroutine control1(n) ! I/O condition specifier control flow
! CHECK: BeginExternalFormattedInput
! CHECK: EnableHandlers
! CHECK: SetAdvance
! CHECK: fir.if
! CHECK: InputReal32
! CHECK: fir.if
! CHECK: InputReal32
! CHECK: fir.if
! CHECK: fir.iterate_while
! CHECK: fir.if
! CHECK: InputReal32
! CHECK: fir.if
! CHECK: fir.iterate_while
! CHECK: fir.if
! CHECK: InputReal32
! CHECK: fir.if
! CHECK: InputReal32
! CHECK: fir.if
! CHECK: InputReal32
! CHECK: fir.if
! CHECK: InputReal32
! CHECK: EndIoStatement
dimension c(n), d(n,n), e(n,n), f(n)
read(*,'(F7.2)', iostat=mm, advance='no') a, b, (c(j), (d(k,j), e(k,j), k=1,n), f(j), j=1,n), g
end

! CHECK-LABEL: func @_QPcontrol2
subroutine control2() ! I/O condition specifier control flow (use index result)
c = 1; d = 9
! CHECK: BeginExternalFormattedOutput
! CHECK: EnableHandlers
! CHECK: :2 = fir.iterate_while
! CHECK: = fir.if
! CHECK: OutputReal
! CHECK: = fir.if
! CHECK: OutputReal
! CHECK: fir.result
! CHECK: else
! CHECK: fir.result %false
! CHECK: fir.result
! CHECK: else
! CHECK: fir.result %false
! CHECK: = arith.addi %arg0, %c1
! CHECK: = arith.select
! CHECK: fir.result
! CHECK: fir.if %{{[0-9]*}}#1
! CHECK: OutputInteger
! CHECK: EndIoStatement
write(*,'(8F4.1,I5)',iostat=m) (c,d,j=11,14), j
end

! CHECK-LABEL: func @_QPcontrol3
subroutine control3 ! I/O condition specifier control flow
    character(10) :: internal(2) = ['aaa','bbb']
    integer stat, k(3)
    ! CHECK:   BeginInternalArrayListInput
    ! CHECK:   EnableHandlers
    ! CHECK:   InputDescriptor
    ! CHECK:   %[[V_15:[0-9]+]] = fir.call @_FortranAioEndIoStatement
    ! CHECK:   %[[V_16:[0-9]+]] = fir.convert %[[V_15]] : (i32) -> index
    ! CHECK:   fir.select %[[V_16]] : index [-2, ^bb1, -1, ^bb1, 0, ^bb1, unit, ^bb2]
    read(internal,*,err=666,iostat=stat) k ! set stat to IOSTAT_END (-1)
    ! CHECK: ^bb1:  // 3 preds: ^bb0, ^bb0, ^bb0
    ! CHECK:   StopStatementText
    ! CHECK:   fir.unreachable
    stop 'fallthrough -> ok'
    ! CHECK: ^bb2:  // pred: ^bb0
    ! CHECK:   BeginExternalListOutput
    ! CHECK:   OutputAscii
    ! CHECK:   EndIoStatement
666 print*, 'FAIL'
    end

! CHECK-LABEL: func @_QPloopnest
subroutine loopnest
   integer :: aa(3,3)
   aa = 10
   ! CHECK: BeginExternalListOutput
   ! CHECK: EnableHandlers
   ! CHECK: {{.*}}:2 = fir.iterate_while ({{.*}} = {{.*}} to {{.*}} step {{.*}}) and ({{.*}} = {{.*}}) -> (index, i1) {
   ! CHECK:   fir.if {{.*}} -> (i1) {
   ! CHECK:     {{.*}}:2 = fir.iterate_while ({{.*}} = {{.*}} to {{.*}} step {{.*}}) and ({{.*}} = {{.*}}) -> (index, i1) {
   ! CHECK:       fir.if {{.*}} -> (i1) {
   ! CHECK:         OutputInteger32
   ! CHECK:         fir.result {{.*}} : i1
   ! CHECK:       } else {
   ! CHECK:         fir.result {{.*}} : i1
   ! CHECK:       }
   ! CHECK:       fir.result {{.*}}, {{.*}} : index, i1
   ! CHECK:     }
   ! CHECK:     fir.result {{.*}}#1 : i1
   ! CHECK:   } else {
   ! CHECK:     fir.result {{.*}} : i1
   ! CHECK:   }
   ! CHECK:   fir.result {{.*}}, {{.*}} : index, i1
   ! CHECK: }
   ! CHECK: EndIoStatement
   write(*,*,err=66) ((aa(j,k)+j+k,j=1,3),k=1,3)
66 continue
end

! CHECK-LABEL: func @_QPimpliedformat
subroutine impliedformat
  ! CHECK: BeginExternalListInput
  ! CHECK: InputReal32
  ! CHECK: EndIoStatement(%3) {{.*}}: (!fir.ref<i8>) -> i32
  read*, x
  ! CHECK: BeginExternalListOutput
  ! CHECK: OutputReal32
  ! CHECK: EndIoStatement
  print*, x
end