Issue 124135
Summary [Flang] User-defined READ/WRITE failed at `SetAsynchronous()` even though it has `ASYNCHRONOUS=NO`.
Labels flang:runtime
Assignees
Reporter DanielCChen
    Consider the following code:
```
module mUserData

    type tUserData
 integer :: sin
        character(len = 30) :: name
    end type tUserData

    interface read(formatted)
        subroutine readUserData(userObj, unit, iotype, v_list, iostat, iomsg)
 import tUserData
            class(tUserData), intent(inout) :: userObj
 integer, intent(in) :: unit
            character(len = *), intent(in) :: iotype
            integer, dimension( : ), intent(in) :: v_list
            integer, intent(out) :: iostat
            character(len = *), intent(inout) :: iomsg
        end subroutine readUserData
    end interface

    interface write(formatted)
        subroutine writeUserData(userObj, unit, iotype, v_list, iostat, iomsg)
 import tUserData
            class(tUserData), intent(in) :: userObj
 integer, intent(in) :: unit
            character(len = *), intent(in) :: iotype
            integer, dimension( : ), intent(in) :: v_list
 integer, intent(out) :: iostat
            character(len = *), intent(inout) :: iomsg
        end subroutine writeUserData
    end interface

end module mUserData


program childAsynchSpec01
    use mUserData

    type(tUserData) :: userIn
    type(tUserData) :: userOut = tUserData(123456789,"Exit, Stage-Right")
    character(len = 256) :: iMsg

    open(203, file='childAsynchSpec01.dat',&
 access='stream', asynchronous='no', iomsg=iMsg,&
        form='formatted', action="" iostat=iStat)
    if (iStat /= 0) then
        write(0, *) "OPEN() <", iStat, "> ", iMsg
        error stop( 1 )
    end if

 write(203, '(DT(40,40))', iomsg=iMsg, iostat=iStat) userOut
    if (iStat /= 0) then
        write(0, *) "WRITE() <", iStat, "> ", iMsg
    end if

    rewind(203, iomsg=iMsg, iostat=iStat)
    if (iStat /= 0) then
 write(0, *) "REWIND() <", iStat, "> ", iMsg
        error stop( 2 )
    end if

    read(203, '(DT(40,40))', iomsg=iMsg, iostat=iStat) userIn
    if (iStat /= 0) then
        write(0, *) "READ() <", iStat, "> ", iMsg
    end if

    close(203, iomsg=iMsg, iostat=iStat)
    if (iStat /= 0) then
        write(0, *) "CLOSE() <", iStat, "> ", iMsg
 error stop( 3 )
    end if

end program childAsynchSpec01

subroutine readUserData(userObj, unit, iotype, v_list, iostat, iomsg)
    use mUserData, only : tUserData

    class(tUserData), intent(inout) :: userObj
    integer, intent(in) :: unit
    character(len = *), intent(in) :: iotype
    integer, dimension( : ), intent(in) :: v_list
    integer, intent(out) :: iostat
    character(len = *), intent(inout) :: iomsg


    read(unit, '(I9,A30)', iomsg=iomsg,&
 asynchronous='no', iostat=iostat) userObj%sin, userObj%name           !! This line is causing runtime error
!          iostat=iostat) userObj%sin, userObj%name                            !! This line executes fine.

end subroutine readUserData

subroutine writeUserData(userObj, unit, iotype, v_list, iostat, iomsg)
    use mUserData, only : tUserData

 class(tUserData), intent(in) :: userObj
    integer, intent(in) :: unit
 character(len = *), intent(in) :: iotype
    integer, dimension( : ), intent(in) :: v_list
    integer, intent(out) :: iostat
    character(len = *), intent(inout) :: iomsg

    write(unit, '(I9,A30)', iostat=iostat, iomsg=iomsg,&
          asynchronous='no') userObj%sin, userObj%name. !! This line is causing runtime error
!          userObj%sin, userObj%name !! This one executes fine.

end subroutine writeUserData
```

The execution of `a.out` has
```
> a.out

fatal Fortran runtime error(/home/cdchen/temp/t.f:99): SetAsynchronous() called when not in an OPEN or external I/O statement
IOT/Abort trap(coredump)
```
_______________________________________________
llvm-bugs mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to