<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/152527>152527</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[flang] DTIO: Polymorphic passed-object does not have the correct dynamic type in DTIO procedure.
</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 reducer:
```
module m
type base
character(3) :: c
contains
procedure, pass :: write
end type
type, extends(base) :: child
integer(4) :: i
end type
interface write(formatted)
subroutine writeformatted(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
integer :: unit = 1
integer :: stat
character(200) :: msg
contains
class(base) function write(dtv)
class(base), intent(in) :: dtv
allocatable :: write
namelist /W/ write
allocate ( write, source = dtv )
write (unit, W, iostat = stat, iomsg = msg )
end function
end module
program funcRetrn001a
use m
class(base), allocatable :: b1
type(child) :: c1 = child ('FTN',123)
open (1, file = 'funcRetrn001a.1', form='formatted', access='sequential' )
b1 = c1%write() !! The passed-object is of type Child.
end program
subroutine writeformatted (dtv, unit, iotype, v_list, iostat, iomsg)
use m, only: base,child
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
select type (dtv)
type is (base)
print*, "base"
type is (child)
print*, "child"
end select
end subroutine
````
Flang outputs `base`, while the expected output is `child` (both gfortran and XLF).
The type of the passed-object of `c1%write()` call should be `child` instead of `base`.
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJycVl-L67YT_TTKy7BBluPEechDfgmBH5S2lIXbtyLbY1tFllxJzt799kWSHTvZ7L10w0I20vw5M3PmIG6taBTigWT_I9l5xQfXanM4cyVQnk4tqlWhq_fDSSsrKjTgWoRaS6nfhGrAYDWUaEh6JPRItnT8o8dOV4NE6Ag9AoB77xEKbjH-BICy5YaXDg1heUrYHnyI9AjlbKGV40LZ2wEA9EaXWA0GCTtBz62d3N6McGNwVFXI5wHdknt7_O5QVZawPCBZ5GyFrG5phHLYBFybhY34JLi3NjUvcYTA8lqbjjuHFWH7W1A7FEYPTqjRbmGUV-7q4Q1KOP8t9AT4-pcUdjyzjo__dbaBZWgPouu1cfcN9h2U3C7KDe7KoXKE5UItivMIluGmDpzgE4eAdZlpMU3Cjj9MNtb3PN-Di_-MblMzcv_7ofwn_npwdzlD_36KeJn_MUJnGx_AM2Ce5syKGxHuqNGgWfYMSHqG5On1DHAJjVG6ABEhEHpc7Mbocz9qqAdVOqHVjZWBZHPXvkQNLqUuueOFxCd7BwCKd-inBIRdvhF2uV0_hkAgLJ-wncDqwZQYmlO568TucO0Np834Nq9CsH3YifQM827Mg5laEQ_9SdSm-Ls3ujG8C1Z_oDOK0oRH58FG_XraYZ_3ST-KZKk5eVSWkci3zyQ7ScAcbCDQcHd5_ZWwHWGnhKXLOnSPypskPm0tZOwVYbs72OskOoNXF5Ke_f2sM-GGlyVaG-8s_jOgcoJLwnZ3bStGZAlh2USgWAVhCWEJvLYY5BerF138jaUDYUHXUedPvqD13O6xxfGA0OOnWghfEsMbreO82Am0ku9hGGFUp0neP53jD5n_uTh90MKvqeDX1e-_6N5PsT2Xu5jIovQzDtP9qCXhWFhYNNXvlfCBjz4LYSxesGc-0458dBpv2LzLEcjIqzsVnt8e4flB6PEiuWpAD64fnAWypQHDlvrgb63fIf-Uwe89lp570TBg2tKYeUtDTdq10NTaOMMVcFXBn79cCNuPDPerEKrx9P-wFroO4R4WyUcuuZRgWz3ICgq8SyqUdcir0XmEvV5Vh7Tap3u-wkOyyzbZbr_Z5av2sOMsSVPGKc_yOqU8T6os22Gy2eO2Kut6JQ6MsozmdJdkSZLka8orXufbNM94WbC0IBuKHRdyLeW1W2vTrIS1Ax6SjGVst5K8QGnDC5Gx2reVpEczKCe6MNTsvDIH7_pSDI0lG-q5audgTjgZHpjRNzvD-fX_v3ma_a7le6dN34ryoXGVRgtKO2j5NU6q1MaEm3fFO1GOFFIh1vwwXK8GIw-tc70Nq3Ih7NII1w7FutQdYRePavx66Y32yQi7hHotYZex5OuB_RsAAP__z0JImg">