This patch is simple and obvious.

Regression tested on x86_64-pc-linux-gnu.

Test case attached. (Changelog for test case will be included)

I will commit tomorrow.

Regards,

Jerry

2019-02-23  Jerry DeLisle <jvdeli...@gcc.gnu.org>

        PR fortran/84387
        * trans-io.c (transfer_expr): Do not return if there are no
        components to the derived type or class.


diff --git a/gcc/fortran/trans-io.c b/gcc/fortran/trans-io.c
index 9a13af4a630..9e7071dc121 100644
--- a/gcc/fortran/trans-io.c
+++ b/gcc/fortran/trans-io.c
@@ -2407,8 +2407,6 @@ transfer_expr (gfc_se * se, gfc_typespec * ts, tree 
addr_expr,

     case_bt_struct:
     case BT_CLASS:
-      if (ts->u.derived->components == NULL)
-       return;
       if (gfc_bt_struct (ts->type) || ts->type == BT_CLASS)
        {
          gfc_symbol *derived;
! { dg-do run }
! PR84387 Defined output does not work for a derived type that
! has no components 
module m
   type :: t
      private
      !integer :: m_i = 0  !<-- ***
   contains
      private
      procedure, pass(this) :: write_t
      generic, public :: write(formatted) => write_t
   end type
contains
   subroutine write_t(this, lun, iotype, vlist, istat, imsg)
      ! argument definitions
      class(t), intent(in)            :: this
      integer, intent(in)             :: lun
      character(len=*), intent(in)    :: iotype
      integer, intent(in)             :: vlist(:)
      integer, intent(out)            :: istat
      character(len=*), intent(inout) :: imsg
      write(lun, fmt=*, iostat=istat, iomsg=imsg) "Hello World!"
      return
   end subroutine write_t

end module

program p
   use m, only : t
   type(t) :: foo
   print "(dt)", foo ! { dg-output " Hello World!" }
end program

Reply via email to