<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">