------- Comment #3 from sgk at troutmask dot apl dot washington dot edu  
2009-08-30 17:58 -------
Subject: Re:  NAMELIST input with just a comment ("&NAME ! comment \") fails

On Sun, Aug 30, 2009 at 05:48:15PM -0000, kargl at gcc dot gnu dot org wrote:
> 
> 
> ------- Comment #2 from kargl at gcc dot gnu dot org  2009-08-30 17:48 -------
> (In reply to comment #1)
> > Thanks for report , I will fix this.
> > 
> 
> It's not broken.
> 

Here's my analysis, which could be wrong.

>From the Fortran 2003 standard;

  10.10.1  Namelist input

  Input for a namelist input statement consists of
    (1)  Optional blanks and namelist comments,
    (2)  The character & followed immediately by the namelist-group-name
         as specified in the NAMELIST statement,
    (3)  One or more blanks,
    (4)  A sequence of zero or more name-value subsequences separated
         by value separators, and
    (5)  A slash to terminate the namelist input.

  10.10.1.6    Namelist Comments

  Except within a character literal constant, a "!" character after a
  value separator or in the first nonblank position of a namelist input
  record initiates a comment.

In Section 10.9, one finds

  A value separator is
    (1) A comma optionally preceded by one or more contiguous blanks
        and optionally followed by one or more contiguous blanks, unless
        the decimal edit mode is COMMA, in which case a semicolon is
        used in place of the comma,
    (2) A slash optionally preceded by one or more contiguous blanks
        and optionally followed by one or more contiguous blanks, or
    (3) One or more contiguous blanks between two nonblank values or
        following the last nonblank value, where a nonblank value is
        a constant, an r *c form, or an r * form.

The namelist that appears to be causing an error in gfortran is

&cmd
! change no values
/

The comment does not follow a value separator, so it comes down to
"or in the first nonblank position of a namelist input record initiates
a comment".  Now, going back to 10.10.1, the first nonblank position
in a namelist input record would need to come before the &.  That is, 
the namelist should be

! change no values
&cmd
/

This modification to the program suggests that my reading of the
Standard may be correct (although I have been known to get it wrong).

program cmdline

   call process(' ', .false.)
   call process('I=10 , J=20 K=30 ! change all three values', .false.)
   call process(' ', .false.)
   call process('! change no values', .true.)  ! CAUSES ERROR IN GFORTRAN, NOT
G95

   contains

   subroutine process(string, invert)
      implicit none
      logical :: invert
      character(len=*) :: string
      character(len=132), save :: lines(3)
      character(len=255) :: message
      INTEGER :: I=1,J=2,K=3
      integer ios
      NAMELIST /CMD/ I,J,K
      save cmd

      if (invert .eqv. .true.) then
        lines(2)='&cmd'
        lines(1)=string
        lines(3)='/'
      else
        lines(1)='&cmd'
        lines(2)=string
        lines(3)='/'
      end if

      READ(lines,NML=CMD,IOSTAT=ios,IOMSG=message)
      if(ios.ne.0)then
         write(*,*)'E-R-R-O-R: PROCESSING COMMAND LINE, IOSTAT=',IOS
         write(*,*)message
      endif
      write(*,NML=CMD)

   end subroutine process

end program cmdline


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=41192

Reply via email to