diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/fortran/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/fortran/io.c | 33 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/fmt_error_10.f | 4 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/fmt_error_7.f | 4 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/fmt_error_9.f | 2 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/fmt_zero_width.f90 | 36 |
7 files changed, 83 insertions, 11 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index f9f9da2..5023949 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,10 @@ +2019-11-06 Jerry DeLisle <jvdelisle@gcc.ngu.org> + + PR fortran/90374 + * io.c (check_format): Allow zero width for D, E, EN, and ES + specifiers as default and when -std=F2018 is given. Retain + existing errors when using the -fdec family of flags. + 2019-11-03 Thomas Koenig <tkoenig@gcc.gnu.org> PR fortran/92113 diff --git a/gcc/fortran/io.c b/gcc/fortran/io.c index b969a1a..57a3fdd 100644 --- a/gcc/fortran/io.c +++ b/gcc/fortran/io.c @@ -922,19 +922,38 @@ data_desc: if (u != FMT_POSINT) { + if (flag_dec) + { + if (flag_dec_format_defaults) + { + /* Assume a default width based on the variable size. */ + saved_token = u; + break; + } + else + { + gfc_error ("Positive width required in format " + "specifier %s at %L", token_to_string (t), + &format_locus); + saved_token = u; + goto fail; + } + } + + format_locus.nextc += format_string_pos; + if (!gfc_notify_std (GFC_STD_F2018, + "positive width required at %L", + &format_locus)) + { + saved_token = u; + goto fail; + } if (flag_dec_format_defaults) { /* Assume a default width based on the variable size. */ saved_token = u; break; } - - format_locus.nextc += format_string_pos; - gfc_error ("Positive width required in format " - "specifier %s at %L", token_to_string (t), - &format_locus); - saved_token = u; - goto fail; } u = format_lex (); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index e404453..6bb85a3 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2019-11-06 Jerry DeLisle <jvdelisle@gcc.ngu.org> + + PR fortran/90374 + * gfortran.dg/fmt_error_10.f: Modify for new constraints. + * gfortran.dg/fmt_error_7.f: Add dg-options "-std=f95". + * gfortran.dg/fmt_error_9.f: Modify for new constraints. + * gfortran.dg/fmt_zero_width.f90: New test. + 2019-11-07 Joseph Myers <joseph@codesourcery.com> * gcc.dg/asm-wide-1.c, gcc.dg/diagnostic-token-ranges.c, diff --git a/gcc/testsuite/gfortran.dg/fmt_error_10.f b/gcc/testsuite/gfortran.dg/fmt_error_10.f index 7ea6aec..6e1a5f6 100644 --- a/gcc/testsuite/gfortran.dg/fmt_error_10.f +++ b/gcc/testsuite/gfortran.dg/fmt_error_10.f @@ -18,9 +18,9 @@ str = '(1pd0.15)' write (line,str,iostat=istat, iomsg=msg) 1.0d0 - if (istat.ne.5006 .or. msg(1:15).ne."Positive width ") STOP 5 + if (line.ne."1.000000000000000") STOP 5 read (*,str,iostat=istat, iomsg=msg) x - if (istat.ne.5006 .or. msg(1:15).ne."Positive width ") STOP 6 + if (istat.ne.5006 .or. msg(1:10).ne."Zero width") STOP 6 if (x.ne.555.25) STOP 7 write (line,'(1pd24.15e11.3)') 1.0d0, 1.234 diff --git a/gcc/testsuite/gfortran.dg/fmt_error_7.f b/gcc/testsuite/gfortran.dg/fmt_error_7.f index 9b5fba9..3937c8f 100644 --- a/gcc/testsuite/gfortran.dg/fmt_error_7.f +++ b/gcc/testsuite/gfortran.dg/fmt_error_7.f @@ -1,7 +1,9 @@ ! { dg-do compile } +! { dg-options "-std=f95" } + ! PR37446 Diagnostic of edit descriptors, esp. EN character(40) :: fmt_string write(*, '(1P,2E12.4)') 1.0 - write(*,'(EN)') 5.0 ! { dg-error "Positive width required" } + write(*,'(EN)') 5.0 ! { dg-error "positive width required" } write(*,'("abcdefg",EN6,"hjjklmnop")') 5.0 ! { dg-error "Period required" } end diff --git a/gcc/testsuite/gfortran.dg/fmt_error_9.f b/gcc/testsuite/gfortran.dg/fmt_error_9.f index 1d67750..40c73599 100644 --- a/gcc/testsuite/gfortran.dg/fmt_error_9.f +++ b/gcc/testsuite/gfortran.dg/fmt_error_9.f @@ -16,7 +16,7 @@ write (line,str,iostat=istat, iomsg=msg) 1.0d0 if (istat.ne.0) STOP 3 read (*,str,iostat=istat, iomsg=msg) x - if (istat.ne.5006 .or. msg(1:15).ne."Positive width ") STOP 4 + if (istat.ne.5006 .or. msg(1:10).ne."Zero width") STOP 4 if (x.ne.555.25) STOP 5 write (line,'(1pd24.15e11.3)') 1.0d0, 1.234 diff --git a/gcc/testsuite/gfortran.dg/fmt_zero_width.f90 b/gcc/testsuite/gfortran.dg/fmt_zero_width.f90 new file mode 100644 index 0000000..093c0a4 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/fmt_zero_width.f90 @@ -0,0 +1,36 @@ +! { dg-do run } +! PR90374 "5.5 d0.d, e0.d, es0.d, en0.d, g0.d and ew.d edit descriptors +program pr90374 + real(4) :: rn + character(32) :: afmt, aresult + real(8) :: one = 1.0D0, zero = 0.0D0, nan, pinf, minf + + nan = zero/zero + rn = 0.00314_4 + afmt = "(D0.3)" + write (aresult,fmt=afmt) rn + if (aresult /= "0.314D-02") stop 12 + afmt = "(E0.10)" + write (aresult,fmt=afmt) rn + if (aresult /= "0.3139999928E-02") stop 15 + afmt = "(ES0.10)" + write (aresult,fmt=afmt) rn + if (aresult /= "3.1399999280E-03") stop 18 + afmt = "(EN0.10)" + write (aresult,fmt=afmt) rn + if (aresult /= "3.1399999280E-03") stop 21 + afmt = "(G0.10)" + write (aresult,fmt=afmt) rn + if (aresult /= "0.3139999928E-02") stop 24 + write (aresult,fmt="(D0.3)") rn + if (aresult /= "0.314D-02") stop 26 + write (aresult,fmt="(E0.10)") rn + if (aresult /= "0.3139999928E-02") stop 28 + write (aresult,fmt="(ES0.10)") rn + if (aresult /= "3.1399999280E-03") stop 30 + write (aresult,fmt="(EN0.10)") rn + if (aresult /= "3.1399999280E-03") stop 32 + write (aresult,fmt="(G0.10)") rn + if (aresult /= "0.3139999928E-02") stop 34 + +end |