re PR libfortran/31052 ([4.2 only] Bad IOSTAT values when readings NAMELISTs past...
authorJerry DeLisle <jvdelisle@gcc.gnu.org>
Sun, 1 Apr 2007 17:33:13 +0000 (17:33 +0000)
committerJerry DeLisle <jvdelisle@gcc.gnu.org>
Sun, 1 Apr 2007 17:33:13 +0000 (17:33 +0000)
2007-04-01  Jerry DeLisle  <jvdelisle@gcc.gnu.org>

PR libgfortran/31052
* gfortran.dg/namelist_28.f90: New test.

From-SVN: r123404

gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/namelist_28.f90 [new file with mode: 0644]

index c04ae81b96f4d1aadda0d6e7a046c4e958fb8d8f..3b4d65abef76499f2e7f014aba93bd87e0deaebc 100644 (file)
@@ -1,3 +1,8 @@
+2007-04-01  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
+
+       PR libgfortran/31052
+       * gfortran.dg/namelist_28.f90: New test.
+
 2007-04-01  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
 
        PR libgfortran/31366
diff --git a/gcc/testsuite/gfortran.dg/namelist_28.f90 b/gcc/testsuite/gfortran.dg/namelist_28.f90
new file mode 100644 (file)
index 0000000..53b1f0f
--- /dev/null
@@ -0,0 +1,90 @@
+! { dg-do run }
+! PR31052 Bad IOSTAT values when readings NAMELISTs past EOF.
+! Patch derived from PR, submitted by Jerry DeLisle <jvdelisle@gcc.gnu.org>
+program gfcbug61
+  implicit none
+  integer, parameter :: nmlunit = 12    ! Namelist unit
+  integer            :: stat
+
+  open (nmlunit, status="scratch")
+  write(nmlunit, '(a)') "&REPORT type='report1' /"
+  write(nmlunit, '(a)') "&REPORT type='report2' /"
+  write(nmlunit, '(a)') "!"
+  rewind (nmlunit)
+
+! The call to position_nml is contained in the subroutine
+  call read_report (nmlunit, stat)
+  rewind (nmlunit)
+  call position_nml (nmlunit, 'MISSING', stat)
+  rewind (nmlunit)
+  call read_report (nmlunit, stat)              ! gfortran fails here
+  
+contains
+
+  subroutine position_nml (unit, name, status)
+    ! Check for presence of namelist 'name'
+    integer                      :: unit, status
+    character(len=*), intent(in) :: name
+
+    character(len=255) :: line
+    integer            :: ios, idx
+    logical            :: first
+
+    first = .true.
+    status = 0
+    do
+       line = ""
+       read (unit,'(a)',iostat=ios) line
+       if (ios < 0) then
+          ! EOF encountered!
+          backspace (unit)
+          status = -1
+          return
+       else if (ios > 0) then
+          ! Error encountered!
+          status = +1
+          return
+       end if
+       idx = index (line, "&"//trim (name))
+       if (idx > 0) then
+          backspace (unit)
+          return
+       end if
+    end do
+  end subroutine position_nml
+
+  subroutine read_report (unit, status)
+    integer :: unit, status
+
+    integer            :: iuse, ios
+    !------------------
+    ! Namelist 'REPORT'
+    !------------------
+    character(len=12) :: type
+    namelist /REPORT/ type
+    !-------------------------------------
+    ! Loop to read namelist multiple times
+    !-------------------------------------
+    iuse = 0
+    do
+       !----------------------------------------
+       ! Preset namelist variables with defaults
+       !----------------------------------------
+       type      = ''
+       !--------------
+       ! Read namelist
+       !--------------
+       call position_nml (unit, "REPORT", status)
+       if (stat /= 0) then
+          ios = status
+          if (iuse /= 2) call abort()
+          return
+       end if
+       read (unit, nml=REPORT, iostat=ios)
+       if (ios /= 0) exit
+       iuse = iuse + 1
+    end do
+    status = ios
+  end subroutine read_report
+
+end program gfcbug61