<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/141124>141124</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            [flang][DTIO] The `iomsg=` specifier is corrupted when no actual I/O error occurred.
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            flang:runtime
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          DanielCChen
      </td>
    </tr>
</table>

<pre>
    Consider the following code:
```
module m

   type base
      character(3) :: c = 'xxx'
      contains
         procedure, pass :: write => writeb
 generic, private :: write(formatted) => write
   end type

   interface
 subroutine writeb (dtv, unit, iotype, v_list, iostat, iomsg)
 import base
         class(base), intent(in) :: dtv
         integer, intent(in) :: unit
         character(*), intent(in) :: iotype
 integer, intent(in)  :: v_list(:)
         integer, intent(out) :: iostat
 character(*), intent(inout) :: iomsg
      end subroutine
   end interface

   contains

      subroutine mywrite( dtv, stat, msg )
 class(base), intent(in) :: dtv
         integer, intent(out) :: stat
 character(*), intent(inout) :: msg
         print*, "in mywrite: msg=", msg
         write ( 1, *, iostat = stat, iomsg = msg ) dtv

 end subroutine

end module

program resolve005
   use m

 class(base), allocatable  :: b1

   integer :: stat = 0
   character(8) :: msg = "original"

   allocate ( b1, source = base('abc') )

   open ( 1, file = 'resolve005.1', form='formatted', access='sequential' )
   call mywrite ( b1, stat, msg)
   if ( ( stat /= 0 ) .or. ( msg /= 'original' ) ) error stop 1

   close ( 1, status ='delete')

end program

subroutine writeb (dtv, unit, iotype, v_list, iostat, iomsg)
   use m, only: base
 class(base), intent(in) :: dtv
   integer, intent(in) :: unit
 character(*), intent(in) :: iotype
   integer, intent(in)  :: v_list(:)
 integer, intent(out) :: iostat
   character(*), intent(inout) :: iomsg

 iostat = 0
   print*, "in writeb, iomsg=", iomsg
end subroutine
```

The expected output should be
```
 in mywrite: msg=original
 in writeb, iomsg=original
```

Flang failed to generated the 2nd print. It seems the value of the actual argument `msg` is corrupted when there is not an actual I/O error. 
The standard says in that case, the `iomsg=` specifier should be intact.
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJysVktv2zgQ_jX0ZVBDpixLPvig2mugp15yX1DUSOaCIrV8OMm_X5B6OkmzbVEghsPhPL-Z-UxmrWgV4olkX0l22TDvbtqcLkwJlOfzDdWm0vXr6ayVFTUacDeERkupn4VqgesaSVqSpCSHZPxLyk7XXiJ0QZyUAOBee4SKWRyOAMBvzDDu0BBapIQeIXhJS-BA0gsQmr-8vBCaL_paOSaUnQUA0BvNsfYGCT1Dz6ydnDwb4TA4Iulfw6EKdi0qNIJHbSPuLOosBoQWjTYdcw7rIaPFfgiLqo6lzHUJ5dA0jMd76yujvRMKx5hAaFG7e4jnlXDhW-hoT89w_1sKO8qsY-N_nW0JPQZvouu1cY-gBRwks5bQIsrpMVoph8oRWgi1AjIEXtkFpTag_SP9mOE60KpBhJafxhqrCln_MMykO9VdhPNQ6mc5au8eAkWokvL_03trGJCdYoU-Lt1aertu5yBdjd1svepz9zpNDoyNnlrZ2RbG8v5kyx6r-k0w1lDENRJBrQw2hFKh5rJG3fRCKB2LWhuOa0YL2A225TLOcY0f5jpKRljGUoOzd70gSRlkA4cM597o1rAODFot75gk2ZCGtwvJfIAyk1Jz5lglcR6_avewvC2aNZgxx2Rs_QrU4hG9kaOoNqIViskAz-R1DDrgUkVgrPaGRz4a1jk0KWcVD_wW_MYxGax1j2pBtBESJz5cat_uouEZAlvF5uQr3oo3jHO0driz-K9H5URIM4d55TiTcmr0OtdlfmdV0USF8BlAoteIU-zkVpttvBpaex3TXaCJMeMHjdEGrNM9LF3gUtvVEIUA3sKQeo0Sw3blM0RhMsZpGAR_lnSnkaJn0Eq-xoEZCfjXt_inKff3qPazAJ-Q7a-Q7E_8CnxMszGQfrtR74lm_G2euzAzzeToPTusnhkkKZ9uCPjSI3dYg_au9w7sTXtZQ_VWHT5itnlOh_v3Ca0U3sS-SqZaaJiQWIPTw_OChUTCG4nGSRXKbeGbA4vY2Si_M-kRdBMPjDvPJDDT-g6VA3JIQtRDAsIC18b4Pvh7vqEK-gaDXGkHTE223wi9fh9WawsjItYxVTNTg2WvNpTlbswBj5N7joHJIZkRPyRge-SiEWgW8EKTGXfbTX1K62N6ZBs87fJ9ftzv0uywuZ3y4pAyTJOmKjjL8pwem6bIC1o1xzQp0nwjTjShWZJRujvusuyw3aVFdaCY4H5_oMf8QPYJdkzIrZT3bqtNuxHWejzt9rsd3W8kq1Da-DCltAlgk7Q0XjnRYRiT7LIxp2D6pfKtJfskzLpdnDnhZHzXDrbZhWRfL0_fvpPsAk-fYfAee6U_gBs0594YrLcbb-Tp5lxv455dCb22wt18teW6I_QaUhq_vvRG_4PcEXqNxVpCr2O99xP9LwAA__9C_3Bq">