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

            Bug ID: 119856
           Summary: Missing commas in I/O formats not diagnosed by default
                    at compile time.
           Product: gcc
           Version: 16.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: fortran
          Assignee: unassigned at gcc dot gnu.org
          Reporter: w6ws at earthlink dot net
  Target Milestone: ---

Based on a posting in the Fortran discourse forum, I tried a few test cases
with missing comma in I/O formats.  With the fix mentioned in PR 88052, my test
cases show diagnostics and the tests abend at run-time.  However it would be
even better if these were caught at compile time.

Gfortran already has code for compile-time checking.  But it isn't enabled by
default.  It should be enabled by default to match the I/O library.

Tested with todays trunk:
$ gfortran --version
GNU Fortran (GCC) 16.0.0 20250417 (experimental)
Copyright (C) 2025 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$$ cat badfmt.f90
program badfmt
  implicit none

  integer :: ierr
  character(*), parameter :: badfmt_p = '(a i0)'
  character(8) :: badfmt_s = '(a i0)'

  interface
    function add_parens (s)
      character(*), intent(in) :: s
      character(len (s) + 2) :: add_parens
    end function
  end interface

! Test with character string in the I/O statement
  write (*,"(ai0)", iostat=ierr) "hi", 3
  if (ierr /= 0) print*,"could not write"

! Test checking FORMAT statements
  write (*,100, iostat=ierr) "hi", 3
100 format (a i0)

! Test using a parameterized string
  write (*,badfmt_p) "hi", 3

! Test using a regular character string (which might need to be diagnosed at
run-time,
! but in theory could be diagnosed at compile time.)
  write (*,badfmt_s) "hi", 3

! Test using a regular character string (which will need to be diagnosed at
run-time)
  write (*, add_parens (badfmt_s)) "hi", 3

end program

function add_parens (s)
  character(*), intent(in) :: s
  character(len (s) + 2) :: add_parens

  add_parens = '(' // s // ')'

end function
$ gfortran -g badfmt.f90 # NOT diagnosed at compile time!
$ ./a.out
 could not write
hi

At line 28 of file badfmt.f90 (unit = 6, file = 'stdout')
Fortran runtime error: Missing comma between descriptors
(a i0)  
   ^

Error termination. Backtrace:
#0  0x7f4e7f7d588a in parse_format_list
        at ../../../gcc-trunk/libgfortran/io/format.c:1240
#1  0x7f4e7f7e89a7 in data_transfer_init
        at ../../../gcc-trunk/libgfortran/io/transfer.c:3298
#2  0x401599 in badfmt
        at /home/wws/computer/fortran/tests/badfmt.f90:28
#3  0x4016bb in main
        at /home/wws/computer/fortran/tests/badfmt.f90:33
$
$
$ gfortran -std=f95 -g badfmt.f90
badfmt.f90:16:13:

   16 |   write (*,"(ai0)", iostat=ierr) "hi", 3
      |             1
Error: GNU Extension: Missing comma at (1)
badfmt.f90:21:15:

   21 | 100 format (a i0)
      |               1
Error: GNU Extension: Missing comma at (1)
badfmt.f90:24:14:

   24 |   write (*,badfmt_p) "hi", 3
      |              1
Error: GNU Extension: Missing comma at (1)
badfmt.f90:20:36:

   20 |   write (*,100, iostat=ierr) "hi", 3
      |                                    1
Error: FORMAT label 100 at (1) not defined
$

Reply via email to