https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61640

            Bug ID: 61640
           Summary: KIND=4 Character Array Internal Unit Read Fail
           Product: gcc
           Version: 4.10.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: libfortran
          Assignee: jvdelisle at gcc dot gnu.org
          Reporter: jvdelisle at gcc dot gnu.org

The following fails on the read. Found while working on another bug.

program read_internal
  integer :: x(9),i,iostat
  character(len=512) :: iomsg
  character(kind=4,len=30), dimension(3) :: source

  source=[4_"  1   1  -1",4_"  1  -1   1",4_" -1   1   1"]
  print *, (trim(source(i)), i=1,3)
  read(source,*) (x(i), i=1,6) ! This read fails for KIND=4 character
end program read_internal

The fix is:

Index: list_read.c
===================================================================
--- list_read.c    (revision 212104)
+++ list_read.c    (working copy)
@@ -273,7 +273,7 @@ next_char_internal (st_parameter_dt *dtp)
   /* Get the next character and handle end-of-record conditions.  */

   if (dtp->common.unit) /* Check for kind=4 internal unit.  */
-   length = sread (dtp->u.p.current_unit->s, &c, sizeof (gfc_char4_t));
+   length = sread (dtp->u.p.current_unit->s, &c, 1);
   else
    {
      char cc;
Index: unix.c
===================================================================
--- unix.c    (revision 212104)
+++ unix.c    (working copy)
@@ -808,10 +808,10 @@ mem_read4 (stream * s, void * buf, ssize_t nbytes)
   void *p;
   int nb = nbytes;

-  p = mem_alloc_r (s, &nb);
+  p = mem_alloc_r4 (s, &nb);
   if (p)
     {
-      memcpy (buf, p, nb);
+      memcpy (buf, p, nb * 4);
       return (ssize_t) nb;
     }
   else

Reply via email to