public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [PATCH] PR fortran/89100 Default widths for i, f and g format specifiers in format strings
@ 2019-05-13  9:45 Mark Eggleston
  2019-05-22  7:58 ` *ping* " Mark Eggleston
  0 siblings, 1 reply; 13+ messages in thread
From: Mark Eggleston @ 2019-05-13  9:45 UTC (permalink / raw)
  To: gcc-patches, fortran

[-- Attachment #1: Type: text/plain, Size: 2794 bytes --]

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89100 see comment 4

Please can someone commit the attached patch as I do not have commit rights.

Change logs:

For gcc/fortran

     Jeff Law  <law@redhat.com>
     Mark Eggleston  <mark.eggleston@codethink.com>

     PR fortran/89100
     * gfortran.texi: Add Default widths for F, G and I format descriptors
     to Extensions section.
     * invoke.texi: Add -fdec-format-defaults
     * io.c (check_format): Use default widths for i, f and g when
     flag_dec_format_defaults is enabled.
     * lang.opt: Add new option.
     * options.c (set_dec_flags): Add SET_BITFLAG for
     flag_dec_format_defaults.

For gcc/testsuite

     Mark Eggleston <mark.eggleston@codethink.com>

     PR fortran/89100
     * gfortran.dg/fmt_f_default_field_width_1.f90: New test.
     * gfortran.dg/fmt_f_default_field_width_2.f90: New test.
     * gfortran.dg/fmt_f_default_field_width_3.f90: New test.
     * gfortran.dg/fmt_g_default_field_width_1.f90: New test.
     * gfortran.dg/fmt_g_default_field_width_2.f90: New test.
     * gfortran.dg/fmt_g_default_field_width_3.f90: New test.
     * gfortran.dg/fmt_i_default_field_width_1.f90: New test.
     * gfortran.dg/fmt_i_default_field_width_2.f90: New test.
     * gfortran.dg/fmt_i_default_field_width_3.f90: New test.

For libgfortran

     Jeff Law  <law@redhat.com>

     PR fortran/89100
     * io/format.c (parse_format_list): set default width when the
     IOPARM_DT_DEC_EXT flag is set for i, f and g.
     * io/io.h: add default_width_for_integer, default_width_for_float
     and default_precision_for_float.
     * io/write.c (write_boz): extra parameter giving length of data
     corresponding to the type's kind.
     (write_b): pass data length as extra parameter in calls to write_boz.
     (write_o): pass data length as extra parameter in calls to write_boz.
     (write_z): pass data length as extra parameter in calls to write_boz.
     (size_from_kind): also set size is default width is set.
     * io/write_float.def (build_float_string): new paramter inserted before
     result parameter. If default width use values passed instead of the
     values in fnode.
     (FORMAT_FLOAT): macro modified to check for default width and calls to
     build_float_string to pass in default width.
     (get_float_string): set width and precision to defaults when needed.


-- 
https://www.codethink.co.uk/privacy.html


[-- Attachment #2: 0002-Default-widths-for-i-f-and-g-format-specifiers-in-fo.patch --]
[-- Type: text/x-patch, Size: 30494 bytes --]

From f952b060a6d5de506022026eef13c86692c23c12 Mon Sep 17 00:00:00 2001
From: law <law@138bc75d-0d04-0410-961f-82ee72b054a4>
Date: Thu, 10 May 2018 11:48:34 +0100
Subject: [PATCH 1/6] Default widths for i, f and g format specifiers in format
 strings.

Enabled using -fdec.

The behaviour is modelled on the Oracle Fortran compiler. At the time
of writing, the details were available at this URL:

  https://docs.oracle.com/cd/E19957-01/805-4939/6j4m0vnc3/index.html#z4000743746d

Addition by Mark Eggleston <mark.eggleston@codethink.com>:

Use -fdec-format-defaults to enable this feature. Also enabled using -fdec.
---
 gcc/fortran/gfortran.texi                          | 17 ++++++++
 gcc/fortran/invoke.texi                            | 25 ++++++-----
 gcc/fortran/io.c                                   | 31 ++++++++++++--
 gcc/fortran/lang.opt                               |  4 ++
 gcc/fortran/options.c                              |  1 +
 .../gfortran.dg/fmt_f_default_field_width_1.f90    | 40 +++++++++++++++++
 .../gfortran.dg/fmt_f_default_field_width_2.f90    | 43 +++++++++++++++++++
 .../gfortran.dg/fmt_f_default_field_width_3.f90    | 30 +++++++++++++
 .../gfortran.dg/fmt_g_default_field_width_1.f90    | 45 +++++++++++++++++++
 .../gfortran.dg/fmt_g_default_field_width_2.f90    | 48 +++++++++++++++++++++
 .../gfortran.dg/fmt_g_default_field_width_3.f90    | 33 ++++++++++++++
 .../gfortran.dg/fmt_i_default_field_width_1.f90    | 40 +++++++++++++++++
 .../gfortran.dg/fmt_i_default_field_width_2.f90    | 44 +++++++++++++++++++
 .../gfortran.dg/fmt_i_default_field_width_3.f90    | 37 ++++++++++++++++
 libgfortran/io/format.c                            | 35 +++++++++++++++
 libgfortran/io/io.h                                | 50 ++++++++++++++++++++++
 libgfortran/io/read.c                              |  6 +++
 libgfortran/io/write.c                             | 22 ++++++----
 libgfortran/io/write_float.def                     | 37 +++++++++++++---
 19 files changed, 560 insertions(+), 28 deletions(-)
 create mode 100644 gcc/testsuite/gfortran.dg/fmt_f_default_field_width_1.f90
 create mode 100644 gcc/testsuite/gfortran.dg/fmt_f_default_field_width_2.f90
 create mode 100644 gcc/testsuite/gfortran.dg/fmt_f_default_field_width_3.f90
 create mode 100644 gcc/testsuite/gfortran.dg/fmt_g_default_field_width_1.f90
 create mode 100644 gcc/testsuite/gfortran.dg/fmt_g_default_field_width_2.f90
 create mode 100644 gcc/testsuite/gfortran.dg/fmt_g_default_field_width_3.f90
 create mode 100644 gcc/testsuite/gfortran.dg/fmt_i_default_field_width_1.f90
 create mode 100644 gcc/testsuite/gfortran.dg/fmt_i_default_field_width_2.f90
 create mode 100644 gcc/testsuite/gfortran.dg/fmt_i_default_field_width_3.f90

diff --git a/gcc/fortran/gfortran.texi b/gcc/fortran/gfortran.texi
index 02ff32f741f..0e6c57142cd 100644
--- a/gcc/fortran/gfortran.texi
+++ b/gcc/fortran/gfortran.texi
@@ -1576,6 +1576,7 @@ additional compatibility extensions along with those enabled by
 * X format descriptor without count field::
 * Commas in FORMAT specifications::
 * Missing period in FORMAT specifications::
+* Default widths for F@comma{} G and I format descriptors::
 * I/O item lists::
 * @code{Q} exponent-letter::
 * BOZ literal constants::
@@ -1782,6 +1783,22 @@ discouraged.
 10     FORMAT ('F4')
 @end smallexample
 
+@node Default widths for F@comma{} G and I format descriptors
+@subsection Default widths for @code{F}, @code{G} and @code{I} format descriptors
+
+To support legacy codes, GNU Fortran allows width to be omitted from format
+specifications if and only if @option{-fdec-format-defaults} is given on the
+command line.  Default widths will be used. This is considered non-conforming
+code and is discouraged.
+
+@smallexample
+       REAL :: value1
+       INTEGER :: value2
+       WRITE(*,10) value1, value1, value2
+10     FORMAT ('F, G, I')
+@end smallexample
+
+
 @node I/O item lists
 @subsection I/O item lists
 @cindex I/O item lists
diff --git a/gcc/fortran/invoke.texi b/gcc/fortran/invoke.texi
index 0e0c2bcb20d..63fce66a593 100644
--- a/gcc/fortran/invoke.texi
+++ b/gcc/fortran/invoke.texi
@@ -117,16 +117,16 @@ by type.  Explanations are in the following sections.
 @item Fortran Language Options
 @xref{Fortran Dialect Options,,Options controlling Fortran dialect}.
 @gccoptlist{-fall-intrinsics -fbackslash -fcray-pointer -fd-lines-as-code @gol
--fd-lines-as-comments @gol
--fdec -fdec-structure -fdec-intrinsic-ints -fdec-static -fdec-math @gol
--fdec-include -fdefault-double-8 -fdefault-integer-8 -fdefault-real-8 @gol
--fdefault-real-10 -fdefault-real-16 -fdollar-ok -ffixed-line-length-@var{n} @gol
--ffixed-line-length-none -fpad-source -ffree-form -ffree-line-length-@var{n} @gol
--ffree-line-length-none -fimplicit-none -finteger-4-integer-8 @gol
--fmax-identifier-length -fmodule-private -ffixed-form -fno-range-check @gol
--fopenacc -fopenmp -freal-4-real-10 -freal-4-real-16 -freal-4-real-8 @gol
--freal-8-real-10 -freal-8-real-16 -freal-8-real-4 -std=@var{std}
--ftest-forall-temp
+-fd-lines-as-comments -fdec -fdec-structure -fdec-intrinsic-ints @gol
+-fdec-static -fdec-math -fdec-include -fdec-format-defaults @gol
+-fdefault-double-8 -fdefault-integer-8 -fdefault-real-8 -fdefault-real-10 @gol
+-fdefault-real-16 -fdollar-ok -ffixed-line-length-@var{n} @gol
+-ffixed-line-length-none -fpad-source -ffree-form @gol
+-ffree-line-length-@var{n} -ffree-line-length-none @gol
+-fimplicit-none -finteger-4-integer-8 -fmax-identifier-length @gol
+-fmodule-private -ffixed-form -fno-range-check -fopenacc -fopenmp @gol
+-freal-4-real-10 -freal-4-real-16 -freal-4-real-8 -freal-8-real-10 @gol
+-freal-8-real-16 -freal-8-real-4 -std=@var{std} -ftest-forall-temp
 }
 
 @item Preprocessing Options
@@ -283,6 +283,11 @@ Enable parsing of INCLUDE as a statement in addition to parsing it as
 INCLUDE line.  When parsed as INCLUDE statement, INCLUDE does not have to
 be on a single line and can use line continuations.
 
+@item -fdec-format-defaults
+@opindex @code{fdec-format-defaults}
+Enable format specifiers F, G and I to be used without width specifiers,
+default widths will be used instead.
+
 @item -fdollar-ok
 @opindex @code{fdollar-ok}
 @cindex @code{$}
diff --git a/gcc/fortran/io.c b/gcc/fortran/io.c
index 95b30132203..80a0d7402d2 100644
--- a/gcc/fortran/io.c
+++ b/gcc/fortran/io.c
@@ -903,6 +903,13 @@ data_desc:
 
       if (u != FMT_POSINT)
 	{
+	  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),
@@ -1027,6 +1034,13 @@ data_desc:
 	goto fail;
       if (t != FMT_ZERO && t != FMT_POSINT)
 	{
+	  if (flag_dec_format_defaults)
+	    {
+	      /* Assume the default width is expected here and continue lexing.  */
+	      value = 0; /* It doesn't matter what we set the value to here.  */
+	      saved_token = t;
+	      break;
+	    }
 	  error = nonneg_required;
 	  goto syntax;
 	}
@@ -1096,8 +1110,17 @@ data_desc:
 	goto fail;
       if (t != FMT_ZERO && t != FMT_POSINT)
 	{
-	  error = nonneg_required;
-	  goto syntax;
+	  if (flag_dec_format_defaults)
+	    {
+	      /* Assume the default width is expected here and continue lexing.  */
+	      value = 0; /* It doesn't matter what we set the value to here.  */
+	      saved_token = t;
+	    }
+	  else
+	    {
+	      error = nonneg_required;
+	      goto syntax;
+	    }
 	}
       else if (is_input && t == FMT_ZERO)
 	{
@@ -4369,8 +4392,8 @@ get_io_list:
     }
 
   /* See if we want to use defaults for missing exponents in real transfers
-     and other DEC runtime extensions.  */
-  if (flag_dec)
+     and other DEC runtime extensions. */
+  if (flag_dec_format_defaults)
     dt->dec_ext = 1;
 
   /* A full IO statement has been matched.  Check the constraints.  spec_end is
diff --git a/gcc/fortran/lang.opt b/gcc/fortran/lang.opt
index 9151d02c491..26e82601b62 100644
--- a/gcc/fortran/lang.opt
+++ b/gcc/fortran/lang.opt
@@ -444,6 +444,10 @@ fdec-include
 Fortran Var(flag_dec_include)
 Enable legacy parsing of INCLUDE as statement.
 
+fdec-format-defaults
+Fortran Var(flag_dec_format_defaults)
+Enable default widths for i, f and g format specifiers.
+
 fdec-intrinsic-ints
 Fortran Var(flag_dec_intrinsic_ints)
 Enable kind-specific variants of integer intrinsic functions.
diff --git a/gcc/fortran/options.c b/gcc/fortran/options.c
index 4e55adec6fe..9ba48dc8439 100644
--- a/gcc/fortran/options.c
+++ b/gcc/fortran/options.c
@@ -74,6 +74,7 @@ set_dec_flags (int value)
   SET_BITFLAG (flag_dec_static, value, value);
   SET_BITFLAG (flag_dec_math, value, value);
   SET_BITFLAG (flag_dec_include, value, value);
+  SET_BITFLAG (flag_dec_format_defaults, value, value);
 }
 
 /* Finalize DEC flags.  */
diff --git a/gcc/testsuite/gfortran.dg/fmt_f_default_field_width_1.f90 b/gcc/testsuite/gfortran.dg/fmt_f_default_field_width_1.f90
new file mode 100644
index 00000000000..5c0834211ff
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/fmt_f_default_field_width_1.f90
@@ -0,0 +1,40 @@
+! { dg-do run }
+! { dg-options -fdec }
+!
+! Test case for the default field widths enabled by the -fdec-format-defaults flag.
+!
+! This feature is not part of any Fortran standard, but it is supported by the
+! Oracle Fortran compiler and others.
+!
+
+program test
+    character(50) :: buffer
+
+    real(4) :: real_4
+    real(8) :: real_8
+    real(16) :: real_16
+    integer :: len
+    character(*), parameter :: fmt = "(A, F, A)"
+
+    real_4 = 4.18
+    write(buffer, fmt) ':',real_4,':'
+    print *,buffer
+    if (buffer.ne.":      4.1799998:") stop 1
+
+    real_4 = 0.00000018
+    write(buffer, fmt) ':',real_4,':'
+    print *,buffer
+    if (buffer.ne.":      0.0000002:") stop 2
+
+    real_8 = 4.18
+    write(buffer, fmt) ':',real_8,':'
+    print *,buffer
+    len = len_trim(buffer)
+    if (len /= 27) stop 3
+
+    real_16 = 4.18
+    write(buffer, fmt) ':',real_16,':'
+    print *,buffer
+    len = len_trim(buffer)
+    if (len /= 44) stop 4
+end
diff --git a/gcc/testsuite/gfortran.dg/fmt_f_default_field_width_2.f90 b/gcc/testsuite/gfortran.dg/fmt_f_default_field_width_2.f90
new file mode 100644
index 00000000000..fd5b1d25a56
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/fmt_f_default_field_width_2.f90
@@ -0,0 +1,43 @@
+! { dg-do run }
+! { dg-options -fdec-format-defaults }
+!
+! Test case for the default field widths enabled by the -fdec-format-defaults flag.
+!
+! This feature is not part of any Fortran standard, but it is supported by the
+! Oracle Fortran compiler and others.
+!
+! Test case added by Mark Eggleston <mark.eggleston@codethink.com> to check
+! use of -fdec-format-defaults
+!
+
+program test
+    character(50) :: buffer
+
+    real(4) :: real_4
+    real(8) :: real_8
+    real(16) :: real_16
+    integer :: len
+    character(*), parameter :: fmt = "(A, F, A)"
+
+    real_4 = 4.18
+    write(buffer, fmt) ':',real_4,':'
+    print *,buffer
+    if (buffer.ne.":      4.1799998:") stop 1
+
+    real_4 = 0.00000018
+    write(buffer, fmt) ':',real_4,':'
+    print *,buffer
+    if (buffer.ne.":      0.0000002:") stop 2
+
+    real_8 = 4.18
+    write(buffer, fmt) ':',real_8,':'
+    print *,buffer
+    len = len_trim(buffer)
+    if (len /= 27) stop 3
+
+    real_16 = 4.18
+    write(buffer, fmt) ':',real_16,':'
+    print *,buffer
+    len = len_trim(buffer)
+    if (len /= 44) stop 4
+end
diff --git a/gcc/testsuite/gfortran.dg/fmt_f_default_field_width_3.f90 b/gcc/testsuite/gfortran.dg/fmt_f_default_field_width_3.f90
new file mode 100644
index 00000000000..6852f8e9aa2
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/fmt_f_default_field_width_3.f90
@@ -0,0 +1,30 @@
+! { dg-do compile }
+! { dg-options "-fdec -fno-dec-format-defaults" }
+!
+! Test case for the default field widths not enabled.
+!
+! Test case added by Mark Eggleston <mark.eggleston@codethink.com> to check
+! use of -fno-dec-format-defaults
+!
+
+program test
+    character(50) :: buffer
+
+    real*4 :: real_4
+    real*8 :: real_8
+    real*16 :: real_16
+    integer :: len
+    character(*), parameter :: fmt = "(A, F, A)"
+
+    real_4 = 4.18
+    write(buffer, fmt) ':',real_4,':' ! { dg-error "Nonnegative width required" }
+
+    real_4 = 0.00000018
+    write(buffer, fmt) ':',real_4,':' ! { dg-error "Nonnegative width required" }
+
+    real_8 = 4.18
+    write(buffer, fmt) ':',real_8,':' ! { dg-error "Nonnegative width required" }
+
+    real_16 = 4.18
+    write(buffer, fmt) ':',real_16,':' ! { dg-error "Nonnegative width required" }
+end
diff --git a/gcc/testsuite/gfortran.dg/fmt_g_default_field_width_1.f90 b/gcc/testsuite/gfortran.dg/fmt_g_default_field_width_1.f90
new file mode 100644
index 00000000000..028cd113929
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/fmt_g_default_field_width_1.f90
@@ -0,0 +1,45 @@
+! { dg-do run }
+! { dg-options -fdec }
+!
+! Test case for the default field widths enabled by the -fdec-format-defaults flag.
+!
+! This feature is not part of any Fortran standard, but it is supported by the
+! Oracle Fortran compiler and others.
+!
+
+program test
+    character(50) :: buffer
+
+    real(4) :: real_4
+    real(8) :: real_8
+    real(16) :: real_16
+    integer :: len
+    character(*), parameter :: fmt = "(A, G, A)"
+
+    real_4 = 4.18
+    write(buffer, fmt) ':',real_4,':'
+    print *,buffer
+    if (buffer.ne.":   4.180000    :") stop 1
+
+    real_4 = 0.00000018
+    write(buffer, fmt) ':',real_4,':'
+    print *,buffer
+    if (buffer.ne.":  0.1800000E-06:") stop 2
+
+    real_4 = 18000000.4
+    write(buffer, fmt) ':',real_4,':'
+    print *,buffer
+    if (buffer.ne.":  0.1800000E+08:") stop 3
+
+    real_8 = 4.18
+    write(buffer, fmt) ':',real_8,':'
+    print *,buffer
+    len = len_trim(buffer)
+    if (len /= 27) stop 4
+
+    real_16 = 4.18
+    write(buffer, fmt) ':',real_16,':'
+    print *,buffer
+    len = len_trim(buffer)
+    if (len /= 44) stop 5
+end
diff --git a/gcc/testsuite/gfortran.dg/fmt_g_default_field_width_2.f90 b/gcc/testsuite/gfortran.dg/fmt_g_default_field_width_2.f90
new file mode 100644
index 00000000000..45c98c7c300
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/fmt_g_default_field_width_2.f90
@@ -0,0 +1,48 @@
+! { dg-do run }
+! { dg-options -fdec-format-defaults }
+!
+! Test case for the default field widths enabled by the -fdec-format-defaults flag.
+!
+! This feature is not part of any Fortran standard, but it is supported by the
+! Oracle Fortran compiler and others.
+!
+! Test case added by Mark Eggleston <mark.eggleston@codethink.com> to check
+! use of -fdec-format-defaults
+!
+
+program test
+    character(50) :: buffer
+
+    real(4) :: real_4
+    real(8) :: real_8
+    real(16) :: real_16
+    integer :: len
+    character(*), parameter :: fmt = "(A, G, A)"
+
+    real_4 = 4.18
+    write(buffer, fmt) ':',real_4,':'
+    print *,buffer
+    if (buffer.ne.":   4.180000    :") stop 1
+
+    real_4 = 0.00000018
+    write(buffer, fmt) ':',real_4,':'
+    print *,buffer
+    if (buffer.ne.":  0.1800000E-06:") stop 2
+
+    real_4 = 18000000.4
+    write(buffer, fmt) ':',real_4,':'
+    print *,buffer
+    if (buffer.ne.":  0.1800000E+08:") stop 3
+
+    real_8 = 4.18
+    write(buffer, fmt) ':',real_8,':'
+    print *,buffer
+    len = len_trim(buffer)
+    if (len /= 27) stop 4
+
+    real_16 = 4.18
+    write(buffer, fmt) ':',real_16,':'
+    print *,buffer
+    len = len_trim(buffer)
+    if (len /= 44) stop 5
+end
diff --git a/gcc/testsuite/gfortran.dg/fmt_g_default_field_width_3.f90 b/gcc/testsuite/gfortran.dg/fmt_g_default_field_width_3.f90
new file mode 100644
index 00000000000..3db4fddd162
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/fmt_g_default_field_width_3.f90
@@ -0,0 +1,33 @@
+! { dg-do compile }
+! { dg-options "-fdec -fno-dec-format-defaults" }
+!
+! Test case for the default field widths not enabled.
+!
+! Test case added by Mark Eggleston <mark.eggleston@codethink.com> to check
+! use of -fno-dec-format-defaults
+!
+
+program test
+    character(50) :: buffer
+
+    real(4) :: real_4
+    real(8) :: real_8
+    real(16) :: real_16
+    integer :: len
+    character(*), parameter :: fmt = "(A, G, A)"
+
+    real_4 = 4.18
+    write(buffer, fmt) ':',real_4,':' ! { dg-error "Positive width required" }
+
+    real_4 = 0.00000018
+    write(buffer, fmt) ':',real_4,':' ! { dg-error "Positive width required" }
+
+    real_4 = 18000000.4
+    write(buffer, fmt) ':',real_4,':' ! { dg-error "Positive width required" }
+
+    real_8 = 4.18
+    write(buffer, fmt) ':',real_8,':' ! { dg-error "Positive width required" }
+
+    real_16 = 4.18
+    write(buffer, fmt) ':',real_16,':' ! { dg-error "Positive width required" }
+end
diff --git a/gcc/testsuite/gfortran.dg/fmt_i_default_field_width_1.f90 b/gcc/testsuite/gfortran.dg/fmt_i_default_field_width_1.f90
new file mode 100644
index 00000000000..bb539adf262
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/fmt_i_default_field_width_1.f90
@@ -0,0 +1,40 @@
+! { dg-do run }
+! { dg-options -fdec }
+!
+! Test case for the default field widths enabled by the -fdec-format-defaults flag.
+!
+! This feature is not part of any Fortran standard, but it is supported by the
+! Oracle Fortran compiler and others.
+
+program test
+    character(50) :: buffer
+    character(1) :: colon
+
+    integer(2) :: integer_2
+    integer(4) :: integer_4
+    integer(8) :: integer_8
+    character(*), parameter :: fmt = "(A, I, A)"
+
+    write(buffer, fmt) ':',12340,':'
+    print *,buffer
+    if (buffer.ne.":       12340:") stop 1
+
+    read(buffer, "(1A, I, 1A)") colon, integer_4, colon
+    if ((integer_4.ne.12340).or.(colon.ne.":")) stop 2
+
+    integer_2 = -99
+    write(buffer, fmt) ':',integer_2,':'
+    print *,buffer
+    if (buffer.ne.":    -99:") stop 3
+
+    integer_8 = -11112222
+    write(buffer, fmt) ':',integer_8,':'
+    print *,buffer
+    if (buffer.ne.":              -11112222:") stop 4
+
+! If the width is 7 and there are 7 leading zeroes, the result should be zero.
+    integer_2 = 789
+    buffer = '0000000789'
+    read(buffer, '(I)') integer_2
+    if (integer_2.ne.0) stop 5
+end
diff --git a/gcc/testsuite/gfortran.dg/fmt_i_default_field_width_2.f90 b/gcc/testsuite/gfortran.dg/fmt_i_default_field_width_2.f90
new file mode 100644
index 00000000000..1583c23e3e2
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/fmt_i_default_field_width_2.f90
@@ -0,0 +1,44 @@
+! { dg-do run }
+! { dg-options -fdec-format-defaults }
+!
+! Test case for the default field widths enabled by the -fdec-format-defaults flag.
+!
+! This feature is not part of any Fortran standard, but it is supported by the
+! Oracle Fortran compiler and others.
+!
+! Test case added by Mark Eggleston <mark.eggleston@codethink.com> to check
+! use of -fdec-format-defaults
+!
+
+program test
+    character(50) :: buffer
+    character(1) :: colon
+
+    integer(2) :: integer_2
+    integer(4) :: integer_4
+    integer(8) :: integer_8
+    character(*), parameter :: fmt = "(A, I, A)"
+
+    write(buffer, fmt) ':',12340,':'
+    print *,buffer
+    if (buffer.ne.":       12340:") stop 1
+
+    read(buffer, '(A1, I, A1)') colon, integer_4, colon
+    if ((integer_4.ne.12340).or.(colon.ne.":")) stop 2
+
+    integer_2 = -99
+    write(buffer, fmt) ':',integer_2,':'
+    print *,buffer
+    if (buffer.ne.":    -99:") stop 3
+
+    integer_8 = -11112222
+    write(buffer, fmt) ':',integer_8,':'
+    print *,buffer
+    if (buffer.ne.":              -11112222:") stop 4
+
+! If the width is 7 and there are 7 leading zeroes, the result should be zero.
+    integer_2 = 789
+    buffer = '0000000789'
+    read(buffer, '(I)') integer_2
+    if (integer_2.ne.0) stop 5
+end
diff --git a/gcc/testsuite/gfortran.dg/fmt_i_default_field_width_3.f90 b/gcc/testsuite/gfortran.dg/fmt_i_default_field_width_3.f90
new file mode 100644
index 00000000000..325190d0dad
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/fmt_i_default_field_width_3.f90
@@ -0,0 +1,37 @@
+! { dg-do compile }
+! { dg-options "-fdec -fno-dec-format-defaults" }
+!
+! Test case for the default field widths enabled by the -fdec-format-defaults flag.
+!
+! This feature is not part of any Fortran standard, but it is supported by the
+! Oracle Fortran compiler and others.
+!
+! Test case added by Mark Eggleston <mark.eggleston@codethink.com> to check
+! use of -fdec-format-defaults
+!
+
+program test
+    character(50) :: buffer
+    character(1) :: colon
+
+    integer(2) :: integer_2
+    integer(4) :: integer_4
+    integer(8) :: integer_8
+    character(*), parameter :: fmt = "(A, I, A)"
+
+    write(buffer, fmt) ':',12340,':' ! { dg-error "Nonnegative width required" }
+
+    read(buffer, '(A1, I, A1)') colon, integer_4, colon ! { dg-error "Nonnegative width required" }
+    if (integer_4.ne.12340) stop 2
+
+    integer_2 = -99
+    write(buffer, fmt) ':',integer_2,':' ! { dg-error "Nonnegative width required" }
+
+    integer_8 = -11112222
+    write(buffer, fmt) ':',integer_8,':' ! { dg-error "Nonnegative width required" }
+
+! If the width is 7 and there are 7 leading zeroes, the result should be zero.
+    integer_2 = 789
+    buffer = '0000000789'
+    read(buffer, '(I)') integer_2 ! { dg-error "Nonnegative width required" }
+end
diff --git a/libgfortran/io/format.c b/libgfortran/io/format.c
index 688764785da..e798d9bda87 100644
--- a/libgfortran/io/format.c
+++ b/libgfortran/io/format.c
@@ -956,12 +956,33 @@ parse_format_list (st_parameter_dt *dtp, bool *seen_dd)
 	  *seen_dd = true;
 	  if (u != FMT_POSINT && u != FMT_ZERO)
 	    {
+	      if (dtp->common.flags & IOPARM_DT_DEC_EXT)
+		{
+		  tail->u.real.w = DEFAULT_WIDTH;
+		  tail->u.real.d = 0;
+		  tail->u.real.e = -1;
+		  fmt->saved_token = u;
+		  break;
+		}
 	      fmt->error = nonneg_required;
 	      goto finished;
 	    }
 	}
+      else if (u == FMT_ZERO)
+	{
+	  fmt->error = posint_required;
+	  goto finished;
+	}
       else if (u != FMT_POSINT)
 	{
+	  if (dtp->common.flags & IOPARM_DT_DEC_EXT)
+	    {
+	      tail->u.real.w = DEFAULT_WIDTH;
+	      tail->u.real.d = 0;
+	      tail->u.real.e = -1;
+	      fmt->saved_token = u;
+	      break;
+	    }
 	  fmt->error = posint_required;
 	  goto finished;
 	}
@@ -1100,6 +1121,13 @@ parse_format_list (st_parameter_dt *dtp, bool *seen_dd)
 	{
 	  if (t != FMT_POSINT)
 	    {
+	      if (dtp->common.flags & IOPARM_DT_DEC_EXT)
+		{
+		  tail->u.integer.w = DEFAULT_WIDTH;
+		  tail->u.integer.m = -1;
+		  fmt->saved_token = t;
+		  break;
+		}
 	      fmt->error = posint_required;
 	      goto finished;
 	    }
@@ -1108,6 +1136,13 @@ parse_format_list (st_parameter_dt *dtp, bool *seen_dd)
 	{
 	  if (t != FMT_ZERO && t != FMT_POSINT)
 	    {
+	      if (dtp->common.flags & IOPARM_DT_DEC_EXT)
+		{
+		  tail->u.integer.w = DEFAULT_WIDTH;
+		  tail->u.integer.m = -1;
+		  fmt->saved_token = t;
+		  break;
+		}
 	      fmt->error = nonneg_required;
 	      goto finished;
 	    }
diff --git a/libgfortran/io/io.h b/libgfortran/io/io.h
index 5caaea280f0..f5e63797ba1 100644
--- a/libgfortran/io/io.h
+++ b/libgfortran/io/io.h
@@ -1011,6 +1011,56 @@ memset4 (gfc_char4_t *p, gfc_char4_t c, int k)
     *p++ = c;
 }
 
+/* Used in width fields to indicate that the default should be used */
+#define DEFAULT_WIDTH -1
+
+/* Defaults for certain format field descriptors. These are decided based on
+ * the type of the value being formatted.
+ *
+ * The behaviour here is modelled on the Oracle Fortran compiler. At the time
+ * of writing, the details were available at this URL:
+ *
+ *   https://docs.oracle.com/cd/E19957-01/805-4939/6j4m0vnc3/index.html#z4000743746d
+ */
+
+static inline int
+default_width_for_integer (int kind)
+{
+  switch (kind)
+    {
+    case 1:
+    case 2:  return  7;
+    case 4:  return 12;
+    case 8:  return 23;
+    case 16: return 44;
+    default: return  0;
+    }
+}
+
+static inline int
+default_width_for_float (int kind)
+{
+  switch (kind)
+    {
+    case 4:  return 15;
+    case 8:  return 25;
+    case 16: return 42;
+    default: return  0;
+    }
+}
+
+static inline int
+default_precision_for_float (int kind)
+{
+  switch (kind)
+    {
+    case 4:  return 7;
+    case 8:  return 16;
+    case 16: return 33;
+    default: return 0;
+    }
+}
+
 #endif
 
 extern void
diff --git a/libgfortran/io/read.c b/libgfortran/io/read.c
index 52ffb4639ac..be9f6cb6f76 100644
--- a/libgfortran/io/read.c
+++ b/libgfortran/io/read.c
@@ -635,6 +635,12 @@ read_decimal (st_parameter_dt *dtp, const fnode *f, char *dest, int length)
 
   w = f->u.w;
 
+  /* This is a legacy extension, and the frontend will only allow such cases
+   * through when -fdec-format-defaults is passed.
+   */
+  if (w == DEFAULT_WIDTH)
+    w = default_width_for_integer (length);
+
   p = read_block_form (dtp, &w);
 
   if (p == NULL)
diff --git a/libgfortran/io/write.c b/libgfortran/io/write.c
index 449b35ff4c8..25005de11c1 100644
--- a/libgfortran/io/write.c
+++ b/libgfortran/io/write.c
@@ -685,9 +685,8 @@ write_l (st_parameter_dt *dtp, const fnode *f, char *source, int len)
   p[wlen - 1] = (n) ? 'T' : 'F';
 }
 
-
 static void
-write_boz (st_parameter_dt *dtp, const fnode *f, const char *q, int n)
+write_boz (st_parameter_dt *dtp, const fnode *f, const char *q, int n, int len)
 {
   int w, m, digits, nzero, nblank;
   char *p;
@@ -720,6 +719,9 @@ write_boz (st_parameter_dt *dtp, const fnode *f, const char *q, int n)
   /* Select a width if none was specified.  The idea here is to always
      print something.  */
 
+  if (w == DEFAULT_WIDTH)
+    w = default_width_for_integer (len);
+
   if (w == 0)
     w = ((digits < m) ? m : digits);
 
@@ -846,6 +848,8 @@ write_decimal (st_parameter_dt *dtp, const fnode *f, const char *source,
 
   /* Select a width if none was specified.  The idea here is to always
      print something.  */
+  if (w == DEFAULT_WIDTH)
+    w = default_width_for_integer (len);
 
   if (w == 0)
     w = ((digits < m) ? m : digits) + nsign;
@@ -1206,13 +1210,13 @@ write_b (st_parameter_dt *dtp, const fnode *f, const char *source, int len)
   if (len > (int) sizeof (GFC_UINTEGER_LARGEST))
     {
       p = btoa_big (source, itoa_buf, len, &n);
-      write_boz (dtp, f, p, n);
+      write_boz (dtp, f, p, n, len);
     }
   else
     {
       n = extract_uint (source, len);
       p = btoa (n, itoa_buf, sizeof (itoa_buf));
-      write_boz (dtp, f, p, n);
+      write_boz (dtp, f, p, n, len);
     }
 }
 
@@ -1227,13 +1231,13 @@ write_o (st_parameter_dt *dtp, const fnode *f, const char *source, int len)
   if (len > (int) sizeof (GFC_UINTEGER_LARGEST))
     {
       p = otoa_big (source, itoa_buf, len, &n);
-      write_boz (dtp, f, p, n);
+      write_boz (dtp, f, p, n, len);
     }
   else
     {
       n = extract_uint (source, len);
       p = otoa (n, itoa_buf, sizeof (itoa_buf));
-      write_boz (dtp, f, p, n);
+      write_boz (dtp, f, p, n, len);
     }
 }
 
@@ -1247,13 +1251,13 @@ write_z (st_parameter_dt *dtp, const fnode *f, const char *source, int len)
   if (len > (int) sizeof (GFC_UINTEGER_LARGEST))
     {
       p = ztoa_big (source, itoa_buf, len, &n);
-      write_boz (dtp, f, p, n);
+      write_boz (dtp, f, p, n, len);
     }
   else
     {
       n = extract_uint (source, len);
       p = gfc_xtoa (n, itoa_buf, sizeof (itoa_buf));
-      write_boz (dtp, f, p, n);
+      write_boz (dtp, f, p, n, len);
     }
 }
 
@@ -1487,7 +1491,7 @@ size_from_kind (st_parameter_dt *dtp, const fnode *f, int kind)
 {
   int size;
 
-  if (f->format == FMT_F && f->u.real.w == 0)
+  if ((f->format == FMT_F && f->u.real.w == 0) || f->u.real.w == DEFAULT_WIDTH)
     {
       switch (kind)
       {
diff --git a/libgfortran/io/write_float.def b/libgfortran/io/write_float.def
index 1e2dee89d83..4a01975d940 100644
--- a/libgfortran/io/write_float.def
+++ b/libgfortran/io/write_float.def
@@ -113,7 +113,8 @@ determine_precision (st_parameter_dt * dtp, const fnode * f, int len)
 static void
 build_float_string (st_parameter_dt *dtp, const fnode *f, char *buffer,
 		    size_t size, int nprinted, int precision, int sign_bit,
-		    bool zero_flag, int npad, char *result, size_t *len)
+		    bool zero_flag, int npad, int default_width, char *result,
+		    size_t *len)
 {
   char *put;
   char *digits;
@@ -132,8 +133,17 @@ build_float_string (st_parameter_dt *dtp, const fnode *f, char *buffer,
   sign_t sign;
 
   ft = f->format;
-  w = f->u.real.w;
-  d = f->u.real.d;
+  if (f->u.real.w == DEFAULT_WIDTH)
+    /* This codepath can only be reached with -fdec-format-defaults. */
+    {
+      w = default_width;
+      d = precision;
+    }
+  else
+    {
+      w = f->u.real.w;
+      d = f->u.real.d;
+    }
   p = dtp->u.p.scale_factor;
   *len = 0;
 
@@ -959,6 +969,11 @@ determine_en_precision (st_parameter_dt *dtp, const fnode *f,
       int save_scale_factor;\
       volatile GFC_REAL_ ## x temp;\
       save_scale_factor = dtp->u.p.scale_factor;\
+      if (w == DEFAULT_WIDTH)\
+	{\
+	  w = default_width;\
+	  d = precision;\
+	}\
       switch (dtp->u.p.current_unit->round_status)\
 	{\
 	  case ROUND_ZERO:\
@@ -1034,7 +1049,8 @@ determine_en_precision (st_parameter_dt *dtp, const fnode *f,
 	  nprinted = FDTOA(y,precision,m);\
 	}\
       build_float_string (dtp, &newf, buffer, size, nprinted, precision,\
-				   sign_bit, zero_flag, npad, result, res_len);\
+				   sign_bit, zero_flag, npad, default_width,\
+				   result, res_len);\
       dtp->u.p.scale_factor = save_scale_factor;\
     }\
   else\
@@ -1044,7 +1060,8 @@ determine_en_precision (st_parameter_dt *dtp, const fnode *f,
       else\
 	nprinted = DTOA(y,precision,m);\
       build_float_string (dtp, f, buffer, size, nprinted, precision,\
-				   sign_bit, zero_flag, npad, result, res_len);\
+				   sign_bit, zero_flag, npad, default_width,\
+				   result, res_len);\
     }\
 }\
 
@@ -1058,6 +1075,16 @@ get_float_string (st_parameter_dt *dtp, const fnode *f, const char *source,
 {
   int sign_bit, nprinted;
   bool zero_flag;
+  int default_width = 0;
+
+  if (f->u.real.w == DEFAULT_WIDTH)
+    /* This codepath can only be reached with -fdec-format-defaults. The default
+     * values are based on those used in the Oracle Fortran compiler.
+     */
+    {
+      default_width = default_width_for_float (kind);
+      precision = default_precision_for_float (kind);
+    }
 
   switch (kind)
     {
-- 
2.11.0


^ permalink raw reply	[flat|nested] 13+ messages in thread

* *ping* Re: [PATCH] PR fortran/89100 Default widths for i, f and g format specifiers in format strings
  2019-05-13  9:45 [PATCH] PR fortran/89100 Default widths for i, f and g format specifiers in format strings Mark Eggleston
@ 2019-05-22  7:58 ` Mark Eggleston
  2019-05-22 11:57   ` Janne Blomqvist
  0 siblings, 1 reply; 13+ messages in thread
From: Mark Eggleston @ 2019-05-22  7:58 UTC (permalink / raw)
  To: gcc-patches, fortran

[-- Attachment #1: Type: text/plain, Size: 2918 bytes --]

On 13/05/2019 10:45, Mark Eggleston wrote:
> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89100 see comment 4
>
> Please can someone commit the attached patch as I do not have commit 
> rights.
>
> Change logs:
>
> For gcc/fortran
>
>     Jeff Law  <law@redhat.com>
>     Mark Eggleston  <mark.eggleston@codethink.com>
>
>     PR fortran/89100
>     * gfortran.texi: Add Default widths for F, G and I format descriptors
>     to Extensions section.
>     * invoke.texi: Add -fdec-format-defaults
>     * io.c (check_format): Use default widths for i, f and g when
>     flag_dec_format_defaults is enabled.
>     * lang.opt: Add new option.
>     * options.c (set_dec_flags): Add SET_BITFLAG for
>     flag_dec_format_defaults.
>
> For gcc/testsuite
>
>     Mark Eggleston <mark.eggleston@codethink.com>
>
>     PR fortran/89100
>     * gfortran.dg/fmt_f_default_field_width_1.f90: New test.
>     * gfortran.dg/fmt_f_default_field_width_2.f90: New test.
>     * gfortran.dg/fmt_f_default_field_width_3.f90: New test.
>     * gfortran.dg/fmt_g_default_field_width_1.f90: New test.
>     * gfortran.dg/fmt_g_default_field_width_2.f90: New test.
>     * gfortran.dg/fmt_g_default_field_width_3.f90: New test.
>     * gfortran.dg/fmt_i_default_field_width_1.f90: New test.
>     * gfortran.dg/fmt_i_default_field_width_2.f90: New test.
>     * gfortran.dg/fmt_i_default_field_width_3.f90: New test.
>
> For libgfortran
>
>     Jeff Law  <law@redhat.com>
>
>     PR fortran/89100
>     * io/format.c (parse_format_list): set default width when the
>     IOPARM_DT_DEC_EXT flag is set for i, f and g.
>     * io/io.h: add default_width_for_integer, default_width_for_float
>     and default_precision_for_float.
>     * io/write.c (write_boz): extra parameter giving length of data
>     corresponding to the type's kind.
>     (write_b): pass data length as extra parameter in calls to write_boz.
>     (write_o): pass data length as extra parameter in calls to write_boz.
>     (write_z): pass data length as extra parameter in calls to write_boz.
>     (size_from_kind): also set size is default width is set.
>     * io/write_float.def (build_float_string): new paramter inserted 
> before
>     result parameter. If default width use values passed instead of the
>     values in fnode.
>     (FORMAT_FLOAT): macro modified to check for default width and 
> calls to
>     build_float_string to pass in default width.
>     (get_float_string): set width and precision to defaults when needed.
>
>
ping?

-- 
https://www.codethink.co.uk/privacy.html


[-- Attachment #2: 0002-Default-widths-for-i-f-and-g-format-specifiers-in-fo.patch --]
[-- Type: text/x-patch, Size: 30494 bytes --]

From f952b060a6d5de506022026eef13c86692c23c12 Mon Sep 17 00:00:00 2001
From: law <law@138bc75d-0d04-0410-961f-82ee72b054a4>
Date: Thu, 10 May 2018 11:48:34 +0100
Subject: [PATCH 1/6] Default widths for i, f and g format specifiers in format
 strings.

Enabled using -fdec.

The behaviour is modelled on the Oracle Fortran compiler. At the time
of writing, the details were available at this URL:

  https://docs.oracle.com/cd/E19957-01/805-4939/6j4m0vnc3/index.html#z4000743746d

Addition by Mark Eggleston <mark.eggleston@codethink.com>:

Use -fdec-format-defaults to enable this feature. Also enabled using -fdec.
---
 gcc/fortran/gfortran.texi                          | 17 ++++++++
 gcc/fortran/invoke.texi                            | 25 ++++++-----
 gcc/fortran/io.c                                   | 31 ++++++++++++--
 gcc/fortran/lang.opt                               |  4 ++
 gcc/fortran/options.c                              |  1 +
 .../gfortran.dg/fmt_f_default_field_width_1.f90    | 40 +++++++++++++++++
 .../gfortran.dg/fmt_f_default_field_width_2.f90    | 43 +++++++++++++++++++
 .../gfortran.dg/fmt_f_default_field_width_3.f90    | 30 +++++++++++++
 .../gfortran.dg/fmt_g_default_field_width_1.f90    | 45 +++++++++++++++++++
 .../gfortran.dg/fmt_g_default_field_width_2.f90    | 48 +++++++++++++++++++++
 .../gfortran.dg/fmt_g_default_field_width_3.f90    | 33 ++++++++++++++
 .../gfortran.dg/fmt_i_default_field_width_1.f90    | 40 +++++++++++++++++
 .../gfortran.dg/fmt_i_default_field_width_2.f90    | 44 +++++++++++++++++++
 .../gfortran.dg/fmt_i_default_field_width_3.f90    | 37 ++++++++++++++++
 libgfortran/io/format.c                            | 35 +++++++++++++++
 libgfortran/io/io.h                                | 50 ++++++++++++++++++++++
 libgfortran/io/read.c                              |  6 +++
 libgfortran/io/write.c                             | 22 ++++++----
 libgfortran/io/write_float.def                     | 37 +++++++++++++---
 19 files changed, 560 insertions(+), 28 deletions(-)
 create mode 100644 gcc/testsuite/gfortran.dg/fmt_f_default_field_width_1.f90
 create mode 100644 gcc/testsuite/gfortran.dg/fmt_f_default_field_width_2.f90
 create mode 100644 gcc/testsuite/gfortran.dg/fmt_f_default_field_width_3.f90
 create mode 100644 gcc/testsuite/gfortran.dg/fmt_g_default_field_width_1.f90
 create mode 100644 gcc/testsuite/gfortran.dg/fmt_g_default_field_width_2.f90
 create mode 100644 gcc/testsuite/gfortran.dg/fmt_g_default_field_width_3.f90
 create mode 100644 gcc/testsuite/gfortran.dg/fmt_i_default_field_width_1.f90
 create mode 100644 gcc/testsuite/gfortran.dg/fmt_i_default_field_width_2.f90
 create mode 100644 gcc/testsuite/gfortran.dg/fmt_i_default_field_width_3.f90

diff --git a/gcc/fortran/gfortran.texi b/gcc/fortran/gfortran.texi
index 02ff32f741f..0e6c57142cd 100644
--- a/gcc/fortran/gfortran.texi
+++ b/gcc/fortran/gfortran.texi
@@ -1576,6 +1576,7 @@ additional compatibility extensions along with those enabled by
 * X format descriptor without count field::
 * Commas in FORMAT specifications::
 * Missing period in FORMAT specifications::
+* Default widths for F@comma{} G and I format descriptors::
 * I/O item lists::
 * @code{Q} exponent-letter::
 * BOZ literal constants::
@@ -1782,6 +1783,22 @@ discouraged.
 10     FORMAT ('F4')
 @end smallexample
 
+@node Default widths for F@comma{} G and I format descriptors
+@subsection Default widths for @code{F}, @code{G} and @code{I} format descriptors
+
+To support legacy codes, GNU Fortran allows width to be omitted from format
+specifications if and only if @option{-fdec-format-defaults} is given on the
+command line.  Default widths will be used. This is considered non-conforming
+code and is discouraged.
+
+@smallexample
+       REAL :: value1
+       INTEGER :: value2
+       WRITE(*,10) value1, value1, value2
+10     FORMAT ('F, G, I')
+@end smallexample
+
+
 @node I/O item lists
 @subsection I/O item lists
 @cindex I/O item lists
diff --git a/gcc/fortran/invoke.texi b/gcc/fortran/invoke.texi
index 0e0c2bcb20d..63fce66a593 100644
--- a/gcc/fortran/invoke.texi
+++ b/gcc/fortran/invoke.texi
@@ -117,16 +117,16 @@ by type.  Explanations are in the following sections.
 @item Fortran Language Options
 @xref{Fortran Dialect Options,,Options controlling Fortran dialect}.
 @gccoptlist{-fall-intrinsics -fbackslash -fcray-pointer -fd-lines-as-code @gol
--fd-lines-as-comments @gol
--fdec -fdec-structure -fdec-intrinsic-ints -fdec-static -fdec-math @gol
--fdec-include -fdefault-double-8 -fdefault-integer-8 -fdefault-real-8 @gol
--fdefault-real-10 -fdefault-real-16 -fdollar-ok -ffixed-line-length-@var{n} @gol
--ffixed-line-length-none -fpad-source -ffree-form -ffree-line-length-@var{n} @gol
--ffree-line-length-none -fimplicit-none -finteger-4-integer-8 @gol
--fmax-identifier-length -fmodule-private -ffixed-form -fno-range-check @gol
--fopenacc -fopenmp -freal-4-real-10 -freal-4-real-16 -freal-4-real-8 @gol
--freal-8-real-10 -freal-8-real-16 -freal-8-real-4 -std=@var{std}
--ftest-forall-temp
+-fd-lines-as-comments -fdec -fdec-structure -fdec-intrinsic-ints @gol
+-fdec-static -fdec-math -fdec-include -fdec-format-defaults @gol
+-fdefault-double-8 -fdefault-integer-8 -fdefault-real-8 -fdefault-real-10 @gol
+-fdefault-real-16 -fdollar-ok -ffixed-line-length-@var{n} @gol
+-ffixed-line-length-none -fpad-source -ffree-form @gol
+-ffree-line-length-@var{n} -ffree-line-length-none @gol
+-fimplicit-none -finteger-4-integer-8 -fmax-identifier-length @gol
+-fmodule-private -ffixed-form -fno-range-check -fopenacc -fopenmp @gol
+-freal-4-real-10 -freal-4-real-16 -freal-4-real-8 -freal-8-real-10 @gol
+-freal-8-real-16 -freal-8-real-4 -std=@var{std} -ftest-forall-temp
 }
 
 @item Preprocessing Options
@@ -283,6 +283,11 @@ Enable parsing of INCLUDE as a statement in addition to parsing it as
 INCLUDE line.  When parsed as INCLUDE statement, INCLUDE does not have to
 be on a single line and can use line continuations.
 
+@item -fdec-format-defaults
+@opindex @code{fdec-format-defaults}
+Enable format specifiers F, G and I to be used without width specifiers,
+default widths will be used instead.
+
 @item -fdollar-ok
 @opindex @code{fdollar-ok}
 @cindex @code{$}
diff --git a/gcc/fortran/io.c b/gcc/fortran/io.c
index 95b30132203..80a0d7402d2 100644
--- a/gcc/fortran/io.c
+++ b/gcc/fortran/io.c
@@ -903,6 +903,13 @@ data_desc:
 
       if (u != FMT_POSINT)
 	{
+	  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),
@@ -1027,6 +1034,13 @@ data_desc:
 	goto fail;
       if (t != FMT_ZERO && t != FMT_POSINT)
 	{
+	  if (flag_dec_format_defaults)
+	    {
+	      /* Assume the default width is expected here and continue lexing.  */
+	      value = 0; /* It doesn't matter what we set the value to here.  */
+	      saved_token = t;
+	      break;
+	    }
 	  error = nonneg_required;
 	  goto syntax;
 	}
@@ -1096,8 +1110,17 @@ data_desc:
 	goto fail;
       if (t != FMT_ZERO && t != FMT_POSINT)
 	{
-	  error = nonneg_required;
-	  goto syntax;
+	  if (flag_dec_format_defaults)
+	    {
+	      /* Assume the default width is expected here and continue lexing.  */
+	      value = 0; /* It doesn't matter what we set the value to here.  */
+	      saved_token = t;
+	    }
+	  else
+	    {
+	      error = nonneg_required;
+	      goto syntax;
+	    }
 	}
       else if (is_input && t == FMT_ZERO)
 	{
@@ -4369,8 +4392,8 @@ get_io_list:
     }
 
   /* See if we want to use defaults for missing exponents in real transfers
-     and other DEC runtime extensions.  */
-  if (flag_dec)
+     and other DEC runtime extensions. */
+  if (flag_dec_format_defaults)
     dt->dec_ext = 1;
 
   /* A full IO statement has been matched.  Check the constraints.  spec_end is
diff --git a/gcc/fortran/lang.opt b/gcc/fortran/lang.opt
index 9151d02c491..26e82601b62 100644
--- a/gcc/fortran/lang.opt
+++ b/gcc/fortran/lang.opt
@@ -444,6 +444,10 @@ fdec-include
 Fortran Var(flag_dec_include)
 Enable legacy parsing of INCLUDE as statement.
 
+fdec-format-defaults
+Fortran Var(flag_dec_format_defaults)
+Enable default widths for i, f and g format specifiers.
+
 fdec-intrinsic-ints
 Fortran Var(flag_dec_intrinsic_ints)
 Enable kind-specific variants of integer intrinsic functions.
diff --git a/gcc/fortran/options.c b/gcc/fortran/options.c
index 4e55adec6fe..9ba48dc8439 100644
--- a/gcc/fortran/options.c
+++ b/gcc/fortran/options.c
@@ -74,6 +74,7 @@ set_dec_flags (int value)
   SET_BITFLAG (flag_dec_static, value, value);
   SET_BITFLAG (flag_dec_math, value, value);
   SET_BITFLAG (flag_dec_include, value, value);
+  SET_BITFLAG (flag_dec_format_defaults, value, value);
 }
 
 /* Finalize DEC flags.  */
diff --git a/gcc/testsuite/gfortran.dg/fmt_f_default_field_width_1.f90 b/gcc/testsuite/gfortran.dg/fmt_f_default_field_width_1.f90
new file mode 100644
index 00000000000..5c0834211ff
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/fmt_f_default_field_width_1.f90
@@ -0,0 +1,40 @@
+! { dg-do run }
+! { dg-options -fdec }
+!
+! Test case for the default field widths enabled by the -fdec-format-defaults flag.
+!
+! This feature is not part of any Fortran standard, but it is supported by the
+! Oracle Fortran compiler and others.
+!
+
+program test
+    character(50) :: buffer
+
+    real(4) :: real_4
+    real(8) :: real_8
+    real(16) :: real_16
+    integer :: len
+    character(*), parameter :: fmt = "(A, F, A)"
+
+    real_4 = 4.18
+    write(buffer, fmt) ':',real_4,':'
+    print *,buffer
+    if (buffer.ne.":      4.1799998:") stop 1
+
+    real_4 = 0.00000018
+    write(buffer, fmt) ':',real_4,':'
+    print *,buffer
+    if (buffer.ne.":      0.0000002:") stop 2
+
+    real_8 = 4.18
+    write(buffer, fmt) ':',real_8,':'
+    print *,buffer
+    len = len_trim(buffer)
+    if (len /= 27) stop 3
+
+    real_16 = 4.18
+    write(buffer, fmt) ':',real_16,':'
+    print *,buffer
+    len = len_trim(buffer)
+    if (len /= 44) stop 4
+end
diff --git a/gcc/testsuite/gfortran.dg/fmt_f_default_field_width_2.f90 b/gcc/testsuite/gfortran.dg/fmt_f_default_field_width_2.f90
new file mode 100644
index 00000000000..fd5b1d25a56
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/fmt_f_default_field_width_2.f90
@@ -0,0 +1,43 @@
+! { dg-do run }
+! { dg-options -fdec-format-defaults }
+!
+! Test case for the default field widths enabled by the -fdec-format-defaults flag.
+!
+! This feature is not part of any Fortran standard, but it is supported by the
+! Oracle Fortran compiler and others.
+!
+! Test case added by Mark Eggleston <mark.eggleston@codethink.com> to check
+! use of -fdec-format-defaults
+!
+
+program test
+    character(50) :: buffer
+
+    real(4) :: real_4
+    real(8) :: real_8
+    real(16) :: real_16
+    integer :: len
+    character(*), parameter :: fmt = "(A, F, A)"
+
+    real_4 = 4.18
+    write(buffer, fmt) ':',real_4,':'
+    print *,buffer
+    if (buffer.ne.":      4.1799998:") stop 1
+
+    real_4 = 0.00000018
+    write(buffer, fmt) ':',real_4,':'
+    print *,buffer
+    if (buffer.ne.":      0.0000002:") stop 2
+
+    real_8 = 4.18
+    write(buffer, fmt) ':',real_8,':'
+    print *,buffer
+    len = len_trim(buffer)
+    if (len /= 27) stop 3
+
+    real_16 = 4.18
+    write(buffer, fmt) ':',real_16,':'
+    print *,buffer
+    len = len_trim(buffer)
+    if (len /= 44) stop 4
+end
diff --git a/gcc/testsuite/gfortran.dg/fmt_f_default_field_width_3.f90 b/gcc/testsuite/gfortran.dg/fmt_f_default_field_width_3.f90
new file mode 100644
index 00000000000..6852f8e9aa2
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/fmt_f_default_field_width_3.f90
@@ -0,0 +1,30 @@
+! { dg-do compile }
+! { dg-options "-fdec -fno-dec-format-defaults" }
+!
+! Test case for the default field widths not enabled.
+!
+! Test case added by Mark Eggleston <mark.eggleston@codethink.com> to check
+! use of -fno-dec-format-defaults
+!
+
+program test
+    character(50) :: buffer
+
+    real*4 :: real_4
+    real*8 :: real_8
+    real*16 :: real_16
+    integer :: len
+    character(*), parameter :: fmt = "(A, F, A)"
+
+    real_4 = 4.18
+    write(buffer, fmt) ':',real_4,':' ! { dg-error "Nonnegative width required" }
+
+    real_4 = 0.00000018
+    write(buffer, fmt) ':',real_4,':' ! { dg-error "Nonnegative width required" }
+
+    real_8 = 4.18
+    write(buffer, fmt) ':',real_8,':' ! { dg-error "Nonnegative width required" }
+
+    real_16 = 4.18
+    write(buffer, fmt) ':',real_16,':' ! { dg-error "Nonnegative width required" }
+end
diff --git a/gcc/testsuite/gfortran.dg/fmt_g_default_field_width_1.f90 b/gcc/testsuite/gfortran.dg/fmt_g_default_field_width_1.f90
new file mode 100644
index 00000000000..028cd113929
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/fmt_g_default_field_width_1.f90
@@ -0,0 +1,45 @@
+! { dg-do run }
+! { dg-options -fdec }
+!
+! Test case for the default field widths enabled by the -fdec-format-defaults flag.
+!
+! This feature is not part of any Fortran standard, but it is supported by the
+! Oracle Fortran compiler and others.
+!
+
+program test
+    character(50) :: buffer
+
+    real(4) :: real_4
+    real(8) :: real_8
+    real(16) :: real_16
+    integer :: len
+    character(*), parameter :: fmt = "(A, G, A)"
+
+    real_4 = 4.18
+    write(buffer, fmt) ':',real_4,':'
+    print *,buffer
+    if (buffer.ne.":   4.180000    :") stop 1
+
+    real_4 = 0.00000018
+    write(buffer, fmt) ':',real_4,':'
+    print *,buffer
+    if (buffer.ne.":  0.1800000E-06:") stop 2
+
+    real_4 = 18000000.4
+    write(buffer, fmt) ':',real_4,':'
+    print *,buffer
+    if (buffer.ne.":  0.1800000E+08:") stop 3
+
+    real_8 = 4.18
+    write(buffer, fmt) ':',real_8,':'
+    print *,buffer
+    len = len_trim(buffer)
+    if (len /= 27) stop 4
+
+    real_16 = 4.18
+    write(buffer, fmt) ':',real_16,':'
+    print *,buffer
+    len = len_trim(buffer)
+    if (len /= 44) stop 5
+end
diff --git a/gcc/testsuite/gfortran.dg/fmt_g_default_field_width_2.f90 b/gcc/testsuite/gfortran.dg/fmt_g_default_field_width_2.f90
new file mode 100644
index 00000000000..45c98c7c300
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/fmt_g_default_field_width_2.f90
@@ -0,0 +1,48 @@
+! { dg-do run }
+! { dg-options -fdec-format-defaults }
+!
+! Test case for the default field widths enabled by the -fdec-format-defaults flag.
+!
+! This feature is not part of any Fortran standard, but it is supported by the
+! Oracle Fortran compiler and others.
+!
+! Test case added by Mark Eggleston <mark.eggleston@codethink.com> to check
+! use of -fdec-format-defaults
+!
+
+program test
+    character(50) :: buffer
+
+    real(4) :: real_4
+    real(8) :: real_8
+    real(16) :: real_16
+    integer :: len
+    character(*), parameter :: fmt = "(A, G, A)"
+
+    real_4 = 4.18
+    write(buffer, fmt) ':',real_4,':'
+    print *,buffer
+    if (buffer.ne.":   4.180000    :") stop 1
+
+    real_4 = 0.00000018
+    write(buffer, fmt) ':',real_4,':'
+    print *,buffer
+    if (buffer.ne.":  0.1800000E-06:") stop 2
+
+    real_4 = 18000000.4
+    write(buffer, fmt) ':',real_4,':'
+    print *,buffer
+    if (buffer.ne.":  0.1800000E+08:") stop 3
+
+    real_8 = 4.18
+    write(buffer, fmt) ':',real_8,':'
+    print *,buffer
+    len = len_trim(buffer)
+    if (len /= 27) stop 4
+
+    real_16 = 4.18
+    write(buffer, fmt) ':',real_16,':'
+    print *,buffer
+    len = len_trim(buffer)
+    if (len /= 44) stop 5
+end
diff --git a/gcc/testsuite/gfortran.dg/fmt_g_default_field_width_3.f90 b/gcc/testsuite/gfortran.dg/fmt_g_default_field_width_3.f90
new file mode 100644
index 00000000000..3db4fddd162
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/fmt_g_default_field_width_3.f90
@@ -0,0 +1,33 @@
+! { dg-do compile }
+! { dg-options "-fdec -fno-dec-format-defaults" }
+!
+! Test case for the default field widths not enabled.
+!
+! Test case added by Mark Eggleston <mark.eggleston@codethink.com> to check
+! use of -fno-dec-format-defaults
+!
+
+program test
+    character(50) :: buffer
+
+    real(4) :: real_4
+    real(8) :: real_8
+    real(16) :: real_16
+    integer :: len
+    character(*), parameter :: fmt = "(A, G, A)"
+
+    real_4 = 4.18
+    write(buffer, fmt) ':',real_4,':' ! { dg-error "Positive width required" }
+
+    real_4 = 0.00000018
+    write(buffer, fmt) ':',real_4,':' ! { dg-error "Positive width required" }
+
+    real_4 = 18000000.4
+    write(buffer, fmt) ':',real_4,':' ! { dg-error "Positive width required" }
+
+    real_8 = 4.18
+    write(buffer, fmt) ':',real_8,':' ! { dg-error "Positive width required" }
+
+    real_16 = 4.18
+    write(buffer, fmt) ':',real_16,':' ! { dg-error "Positive width required" }
+end
diff --git a/gcc/testsuite/gfortran.dg/fmt_i_default_field_width_1.f90 b/gcc/testsuite/gfortran.dg/fmt_i_default_field_width_1.f90
new file mode 100644
index 00000000000..bb539adf262
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/fmt_i_default_field_width_1.f90
@@ -0,0 +1,40 @@
+! { dg-do run }
+! { dg-options -fdec }
+!
+! Test case for the default field widths enabled by the -fdec-format-defaults flag.
+!
+! This feature is not part of any Fortran standard, but it is supported by the
+! Oracle Fortran compiler and others.
+
+program test
+    character(50) :: buffer
+    character(1) :: colon
+
+    integer(2) :: integer_2
+    integer(4) :: integer_4
+    integer(8) :: integer_8
+    character(*), parameter :: fmt = "(A, I, A)"
+
+    write(buffer, fmt) ':',12340,':'
+    print *,buffer
+    if (buffer.ne.":       12340:") stop 1
+
+    read(buffer, "(1A, I, 1A)") colon, integer_4, colon
+    if ((integer_4.ne.12340).or.(colon.ne.":")) stop 2
+
+    integer_2 = -99
+    write(buffer, fmt) ':',integer_2,':'
+    print *,buffer
+    if (buffer.ne.":    -99:") stop 3
+
+    integer_8 = -11112222
+    write(buffer, fmt) ':',integer_8,':'
+    print *,buffer
+    if (buffer.ne.":              -11112222:") stop 4
+
+! If the width is 7 and there are 7 leading zeroes, the result should be zero.
+    integer_2 = 789
+    buffer = '0000000789'
+    read(buffer, '(I)') integer_2
+    if (integer_2.ne.0) stop 5
+end
diff --git a/gcc/testsuite/gfortran.dg/fmt_i_default_field_width_2.f90 b/gcc/testsuite/gfortran.dg/fmt_i_default_field_width_2.f90
new file mode 100644
index 00000000000..1583c23e3e2
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/fmt_i_default_field_width_2.f90
@@ -0,0 +1,44 @@
+! { dg-do run }
+! { dg-options -fdec-format-defaults }
+!
+! Test case for the default field widths enabled by the -fdec-format-defaults flag.
+!
+! This feature is not part of any Fortran standard, but it is supported by the
+! Oracle Fortran compiler and others.
+!
+! Test case added by Mark Eggleston <mark.eggleston@codethink.com> to check
+! use of -fdec-format-defaults
+!
+
+program test
+    character(50) :: buffer
+    character(1) :: colon
+
+    integer(2) :: integer_2
+    integer(4) :: integer_4
+    integer(8) :: integer_8
+    character(*), parameter :: fmt = "(A, I, A)"
+
+    write(buffer, fmt) ':',12340,':'
+    print *,buffer
+    if (buffer.ne.":       12340:") stop 1
+
+    read(buffer, '(A1, I, A1)') colon, integer_4, colon
+    if ((integer_4.ne.12340).or.(colon.ne.":")) stop 2
+
+    integer_2 = -99
+    write(buffer, fmt) ':',integer_2,':'
+    print *,buffer
+    if (buffer.ne.":    -99:") stop 3
+
+    integer_8 = -11112222
+    write(buffer, fmt) ':',integer_8,':'
+    print *,buffer
+    if (buffer.ne.":              -11112222:") stop 4
+
+! If the width is 7 and there are 7 leading zeroes, the result should be zero.
+    integer_2 = 789
+    buffer = '0000000789'
+    read(buffer, '(I)') integer_2
+    if (integer_2.ne.0) stop 5
+end
diff --git a/gcc/testsuite/gfortran.dg/fmt_i_default_field_width_3.f90 b/gcc/testsuite/gfortran.dg/fmt_i_default_field_width_3.f90
new file mode 100644
index 00000000000..325190d0dad
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/fmt_i_default_field_width_3.f90
@@ -0,0 +1,37 @@
+! { dg-do compile }
+! { dg-options "-fdec -fno-dec-format-defaults" }
+!
+! Test case for the default field widths enabled by the -fdec-format-defaults flag.
+!
+! This feature is not part of any Fortran standard, but it is supported by the
+! Oracle Fortran compiler and others.
+!
+! Test case added by Mark Eggleston <mark.eggleston@codethink.com> to check
+! use of -fdec-format-defaults
+!
+
+program test
+    character(50) :: buffer
+    character(1) :: colon
+
+    integer(2) :: integer_2
+    integer(4) :: integer_4
+    integer(8) :: integer_8
+    character(*), parameter :: fmt = "(A, I, A)"
+
+    write(buffer, fmt) ':',12340,':' ! { dg-error "Nonnegative width required" }
+
+    read(buffer, '(A1, I, A1)') colon, integer_4, colon ! { dg-error "Nonnegative width required" }
+    if (integer_4.ne.12340) stop 2
+
+    integer_2 = -99
+    write(buffer, fmt) ':',integer_2,':' ! { dg-error "Nonnegative width required" }
+
+    integer_8 = -11112222
+    write(buffer, fmt) ':',integer_8,':' ! { dg-error "Nonnegative width required" }
+
+! If the width is 7 and there are 7 leading zeroes, the result should be zero.
+    integer_2 = 789
+    buffer = '0000000789'
+    read(buffer, '(I)') integer_2 ! { dg-error "Nonnegative width required" }
+end
diff --git a/libgfortran/io/format.c b/libgfortran/io/format.c
index 688764785da..e798d9bda87 100644
--- a/libgfortran/io/format.c
+++ b/libgfortran/io/format.c
@@ -956,12 +956,33 @@ parse_format_list (st_parameter_dt *dtp, bool *seen_dd)
 	  *seen_dd = true;
 	  if (u != FMT_POSINT && u != FMT_ZERO)
 	    {
+	      if (dtp->common.flags & IOPARM_DT_DEC_EXT)
+		{
+		  tail->u.real.w = DEFAULT_WIDTH;
+		  tail->u.real.d = 0;
+		  tail->u.real.e = -1;
+		  fmt->saved_token = u;
+		  break;
+		}
 	      fmt->error = nonneg_required;
 	      goto finished;
 	    }
 	}
+      else if (u == FMT_ZERO)
+	{
+	  fmt->error = posint_required;
+	  goto finished;
+	}
       else if (u != FMT_POSINT)
 	{
+	  if (dtp->common.flags & IOPARM_DT_DEC_EXT)
+	    {
+	      tail->u.real.w = DEFAULT_WIDTH;
+	      tail->u.real.d = 0;
+	      tail->u.real.e = -1;
+	      fmt->saved_token = u;
+	      break;
+	    }
 	  fmt->error = posint_required;
 	  goto finished;
 	}
@@ -1100,6 +1121,13 @@ parse_format_list (st_parameter_dt *dtp, bool *seen_dd)
 	{
 	  if (t != FMT_POSINT)
 	    {
+	      if (dtp->common.flags & IOPARM_DT_DEC_EXT)
+		{
+		  tail->u.integer.w = DEFAULT_WIDTH;
+		  tail->u.integer.m = -1;
+		  fmt->saved_token = t;
+		  break;
+		}
 	      fmt->error = posint_required;
 	      goto finished;
 	    }
@@ -1108,6 +1136,13 @@ parse_format_list (st_parameter_dt *dtp, bool *seen_dd)
 	{
 	  if (t != FMT_ZERO && t != FMT_POSINT)
 	    {
+	      if (dtp->common.flags & IOPARM_DT_DEC_EXT)
+		{
+		  tail->u.integer.w = DEFAULT_WIDTH;
+		  tail->u.integer.m = -1;
+		  fmt->saved_token = t;
+		  break;
+		}
 	      fmt->error = nonneg_required;
 	      goto finished;
 	    }
diff --git a/libgfortran/io/io.h b/libgfortran/io/io.h
index 5caaea280f0..f5e63797ba1 100644
--- a/libgfortran/io/io.h
+++ b/libgfortran/io/io.h
@@ -1011,6 +1011,56 @@ memset4 (gfc_char4_t *p, gfc_char4_t c, int k)
     *p++ = c;
 }
 
+/* Used in width fields to indicate that the default should be used */
+#define DEFAULT_WIDTH -1
+
+/* Defaults for certain format field descriptors. These are decided based on
+ * the type of the value being formatted.
+ *
+ * The behaviour here is modelled on the Oracle Fortran compiler. At the time
+ * of writing, the details were available at this URL:
+ *
+ *   https://docs.oracle.com/cd/E19957-01/805-4939/6j4m0vnc3/index.html#z4000743746d
+ */
+
+static inline int
+default_width_for_integer (int kind)
+{
+  switch (kind)
+    {
+    case 1:
+    case 2:  return  7;
+    case 4:  return 12;
+    case 8:  return 23;
+    case 16: return 44;
+    default: return  0;
+    }
+}
+
+static inline int
+default_width_for_float (int kind)
+{
+  switch (kind)
+    {
+    case 4:  return 15;
+    case 8:  return 25;
+    case 16: return 42;
+    default: return  0;
+    }
+}
+
+static inline int
+default_precision_for_float (int kind)
+{
+  switch (kind)
+    {
+    case 4:  return 7;
+    case 8:  return 16;
+    case 16: return 33;
+    default: return 0;
+    }
+}
+
 #endif
 
 extern void
diff --git a/libgfortran/io/read.c b/libgfortran/io/read.c
index 52ffb4639ac..be9f6cb6f76 100644
--- a/libgfortran/io/read.c
+++ b/libgfortran/io/read.c
@@ -635,6 +635,12 @@ read_decimal (st_parameter_dt *dtp, const fnode *f, char *dest, int length)
 
   w = f->u.w;
 
+  /* This is a legacy extension, and the frontend will only allow such cases
+   * through when -fdec-format-defaults is passed.
+   */
+  if (w == DEFAULT_WIDTH)
+    w = default_width_for_integer (length);
+
   p = read_block_form (dtp, &w);
 
   if (p == NULL)
diff --git a/libgfortran/io/write.c b/libgfortran/io/write.c
index 449b35ff4c8..25005de11c1 100644
--- a/libgfortran/io/write.c
+++ b/libgfortran/io/write.c
@@ -685,9 +685,8 @@ write_l (st_parameter_dt *dtp, const fnode *f, char *source, int len)
   p[wlen - 1] = (n) ? 'T' : 'F';
 }
 
-
 static void
-write_boz (st_parameter_dt *dtp, const fnode *f, const char *q, int n)
+write_boz (st_parameter_dt *dtp, const fnode *f, const char *q, int n, int len)
 {
   int w, m, digits, nzero, nblank;
   char *p;
@@ -720,6 +719,9 @@ write_boz (st_parameter_dt *dtp, const fnode *f, const char *q, int n)
   /* Select a width if none was specified.  The idea here is to always
      print something.  */
 
+  if (w == DEFAULT_WIDTH)
+    w = default_width_for_integer (len);
+
   if (w == 0)
     w = ((digits < m) ? m : digits);
 
@@ -846,6 +848,8 @@ write_decimal (st_parameter_dt *dtp, const fnode *f, const char *source,
 
   /* Select a width if none was specified.  The idea here is to always
      print something.  */
+  if (w == DEFAULT_WIDTH)
+    w = default_width_for_integer (len);
 
   if (w == 0)
     w = ((digits < m) ? m : digits) + nsign;
@@ -1206,13 +1210,13 @@ write_b (st_parameter_dt *dtp, const fnode *f, const char *source, int len)
   if (len > (int) sizeof (GFC_UINTEGER_LARGEST))
     {
       p = btoa_big (source, itoa_buf, len, &n);
-      write_boz (dtp, f, p, n);
+      write_boz (dtp, f, p, n, len);
     }
   else
     {
       n = extract_uint (source, len);
       p = btoa (n, itoa_buf, sizeof (itoa_buf));
-      write_boz (dtp, f, p, n);
+      write_boz (dtp, f, p, n, len);
     }
 }
 
@@ -1227,13 +1231,13 @@ write_o (st_parameter_dt *dtp, const fnode *f, const char *source, int len)
   if (len > (int) sizeof (GFC_UINTEGER_LARGEST))
     {
       p = otoa_big (source, itoa_buf, len, &n);
-      write_boz (dtp, f, p, n);
+      write_boz (dtp, f, p, n, len);
     }
   else
     {
       n = extract_uint (source, len);
       p = otoa (n, itoa_buf, sizeof (itoa_buf));
-      write_boz (dtp, f, p, n);
+      write_boz (dtp, f, p, n, len);
     }
 }
 
@@ -1247,13 +1251,13 @@ write_z (st_parameter_dt *dtp, const fnode *f, const char *source, int len)
   if (len > (int) sizeof (GFC_UINTEGER_LARGEST))
     {
       p = ztoa_big (source, itoa_buf, len, &n);
-      write_boz (dtp, f, p, n);
+      write_boz (dtp, f, p, n, len);
     }
   else
     {
       n = extract_uint (source, len);
       p = gfc_xtoa (n, itoa_buf, sizeof (itoa_buf));
-      write_boz (dtp, f, p, n);
+      write_boz (dtp, f, p, n, len);
     }
 }
 
@@ -1487,7 +1491,7 @@ size_from_kind (st_parameter_dt *dtp, const fnode *f, int kind)
 {
   int size;
 
-  if (f->format == FMT_F && f->u.real.w == 0)
+  if ((f->format == FMT_F && f->u.real.w == 0) || f->u.real.w == DEFAULT_WIDTH)
     {
       switch (kind)
       {
diff --git a/libgfortran/io/write_float.def b/libgfortran/io/write_float.def
index 1e2dee89d83..4a01975d940 100644
--- a/libgfortran/io/write_float.def
+++ b/libgfortran/io/write_float.def
@@ -113,7 +113,8 @@ determine_precision (st_parameter_dt * dtp, const fnode * f, int len)
 static void
 build_float_string (st_parameter_dt *dtp, const fnode *f, char *buffer,
 		    size_t size, int nprinted, int precision, int sign_bit,
-		    bool zero_flag, int npad, char *result, size_t *len)
+		    bool zero_flag, int npad, int default_width, char *result,
+		    size_t *len)
 {
   char *put;
   char *digits;
@@ -132,8 +133,17 @@ build_float_string (st_parameter_dt *dtp, const fnode *f, char *buffer,
   sign_t sign;
 
   ft = f->format;
-  w = f->u.real.w;
-  d = f->u.real.d;
+  if (f->u.real.w == DEFAULT_WIDTH)
+    /* This codepath can only be reached with -fdec-format-defaults. */
+    {
+      w = default_width;
+      d = precision;
+    }
+  else
+    {
+      w = f->u.real.w;
+      d = f->u.real.d;
+    }
   p = dtp->u.p.scale_factor;
   *len = 0;
 
@@ -959,6 +969,11 @@ determine_en_precision (st_parameter_dt *dtp, const fnode *f,
       int save_scale_factor;\
       volatile GFC_REAL_ ## x temp;\
       save_scale_factor = dtp->u.p.scale_factor;\
+      if (w == DEFAULT_WIDTH)\
+	{\
+	  w = default_width;\
+	  d = precision;\
+	}\
       switch (dtp->u.p.current_unit->round_status)\
 	{\
 	  case ROUND_ZERO:\
@@ -1034,7 +1049,8 @@ determine_en_precision (st_parameter_dt *dtp, const fnode *f,
 	  nprinted = FDTOA(y,precision,m);\
 	}\
       build_float_string (dtp, &newf, buffer, size, nprinted, precision,\
-				   sign_bit, zero_flag, npad, result, res_len);\
+				   sign_bit, zero_flag, npad, default_width,\
+				   result, res_len);\
       dtp->u.p.scale_factor = save_scale_factor;\
     }\
   else\
@@ -1044,7 +1060,8 @@ determine_en_precision (st_parameter_dt *dtp, const fnode *f,
       else\
 	nprinted = DTOA(y,precision,m);\
       build_float_string (dtp, f, buffer, size, nprinted, precision,\
-				   sign_bit, zero_flag, npad, result, res_len);\
+				   sign_bit, zero_flag, npad, default_width,\
+				   result, res_len);\
     }\
 }\
 
@@ -1058,6 +1075,16 @@ get_float_string (st_parameter_dt *dtp, const fnode *f, const char *source,
 {
   int sign_bit, nprinted;
   bool zero_flag;
+  int default_width = 0;
+
+  if (f->u.real.w == DEFAULT_WIDTH)
+    /* This codepath can only be reached with -fdec-format-defaults. The default
+     * values are based on those used in the Oracle Fortran compiler.
+     */
+    {
+      default_width = default_width_for_float (kind);
+      precision = default_precision_for_float (kind);
+    }
 
   switch (kind)
     {
-- 
2.11.0


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: *ping* Re: [PATCH] PR fortran/89100 Default widths for i, f and g format specifiers in format strings
  2019-05-22  7:58 ` *ping* " Mark Eggleston
@ 2019-05-22 11:57   ` Janne Blomqvist
  2019-05-23 10:38     ` Christophe Lyon
  0 siblings, 1 reply; 13+ messages in thread
From: Janne Blomqvist @ 2019-05-22 11:57 UTC (permalink / raw)
  To: Mark Eggleston; +Cc: gcc-patches, fortran

On Wed, May 22, 2019 at 10:58 AM Mark Eggleston
<mark.eggleston@codethink.co.uk> wrote:
>
> On 13/05/2019 10:45, Mark Eggleston wrote:
> > https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89100 see comment 4
> >
> > Please can someone commit the attached patch as I do not have commit
> > rights.
> >
> > Change logs:
> >
> > For gcc/fortran
> >
> >     Jeff Law  <law@redhat.com>
> >     Mark Eggleston  <mark.eggleston@codethink.com>
> >
> >     PR fortran/89100
> >     * gfortran.texi: Add Default widths for F, G and I format descriptors
> >     to Extensions section.
> >     * invoke.texi: Add -fdec-format-defaults
> >     * io.c (check_format): Use default widths for i, f and g when
> >     flag_dec_format_defaults is enabled.
> >     * lang.opt: Add new option.
> >     * options.c (set_dec_flags): Add SET_BITFLAG for
> >     flag_dec_format_defaults.
> >
> > For gcc/testsuite
> >
> >     Mark Eggleston <mark.eggleston@codethink.com>
> >
> >     PR fortran/89100
> >     * gfortran.dg/fmt_f_default_field_width_1.f90: New test.
> >     * gfortran.dg/fmt_f_default_field_width_2.f90: New test.
> >     * gfortran.dg/fmt_f_default_field_width_3.f90: New test.
> >     * gfortran.dg/fmt_g_default_field_width_1.f90: New test.
> >     * gfortran.dg/fmt_g_default_field_width_2.f90: New test.
> >     * gfortran.dg/fmt_g_default_field_width_3.f90: New test.
> >     * gfortran.dg/fmt_i_default_field_width_1.f90: New test.
> >     * gfortran.dg/fmt_i_default_field_width_2.f90: New test.
> >     * gfortran.dg/fmt_i_default_field_width_3.f90: New test.
> >
> > For libgfortran
> >
> >     Jeff Law  <law@redhat.com>
> >
> >     PR fortran/89100
> >     * io/format.c (parse_format_list): set default width when the
> >     IOPARM_DT_DEC_EXT flag is set for i, f and g.
> >     * io/io.h: add default_width_for_integer, default_width_for_float
> >     and default_precision_for_float.
> >     * io/write.c (write_boz): extra parameter giving length of data
> >     corresponding to the type's kind.
> >     (write_b): pass data length as extra parameter in calls to write_boz.
> >     (write_o): pass data length as extra parameter in calls to write_boz.
> >     (write_z): pass data length as extra parameter in calls to write_boz.
> >     (size_from_kind): also set size is default width is set.
> >     * io/write_float.def (build_float_string): new paramter inserted
> > before
> >     result parameter. If default width use values passed instead of the
> >     values in fnode.
> >     (FORMAT_FLOAT): macro modified to check for default width and
> > calls to
> >     build_float_string to pass in default width.
> >     (get_float_string): set width and precision to defaults when needed.
> >
> >
> ping?


Committed as r271511.

-- 
Janne Blomqvist

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: *ping* Re: [PATCH] PR fortran/89100 Default widths for i, f and g format specifiers in format strings
  2019-05-22 11:57   ` Janne Blomqvist
@ 2019-05-23 10:38     ` Christophe Lyon
  2019-05-23 13:54       ` Mark Eggleston
  2019-05-23 13:58       ` Steve Kargl
  0 siblings, 2 replies; 13+ messages in thread
From: Christophe Lyon @ 2019-05-23 10:38 UTC (permalink / raw)
  To: Janne Blomqvist; +Cc: Mark Eggleston, gcc-patches, fortran

On Wed, 22 May 2019 at 13:57, Janne Blomqvist <blomqvist.janne@gmail.com> wrote:
>
> On Wed, May 22, 2019 at 10:58 AM Mark Eggleston
> <mark.eggleston@codethink.co.uk> wrote:
> >
> > On 13/05/2019 10:45, Mark Eggleston wrote:
> > > https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89100 see comment 4
> > >
> > > Please can someone commit the attached patch as I do not have commit
> > > rights.
> > >
> > > Change logs:
> > >
> > > For gcc/fortran
> > >
> > >     Jeff Law  <law@redhat.com>
> > >     Mark Eggleston  <mark.eggleston@codethink.com>
> > >
> > >     PR fortran/89100
> > >     * gfortran.texi: Add Default widths for F, G and I format descriptors
> > >     to Extensions section.
> > >     * invoke.texi: Add -fdec-format-defaults
> > >     * io.c (check_format): Use default widths for i, f and g when
> > >     flag_dec_format_defaults is enabled.
> > >     * lang.opt: Add new option.
> > >     * options.c (set_dec_flags): Add SET_BITFLAG for
> > >     flag_dec_format_defaults.
> > >
> > > For gcc/testsuite
> > >
> > >     Mark Eggleston <mark.eggleston@codethink.com>
> > >
> > >     PR fortran/89100
> > >     * gfortran.dg/fmt_f_default_field_width_1.f90: New test.
> > >     * gfortran.dg/fmt_f_default_field_width_2.f90: New test.
> > >     * gfortran.dg/fmt_f_default_field_width_3.f90: New test.
> > >     * gfortran.dg/fmt_g_default_field_width_1.f90: New test.
> > >     * gfortran.dg/fmt_g_default_field_width_2.f90: New test.
> > >     * gfortran.dg/fmt_g_default_field_width_3.f90: New test.
> > >     * gfortran.dg/fmt_i_default_field_width_1.f90: New test.
> > >     * gfortran.dg/fmt_i_default_field_width_2.f90: New test.
> > >     * gfortran.dg/fmt_i_default_field_width_3.f90: New test.
> > >
> > > For libgfortran
> > >
> > >     Jeff Law  <law@redhat.com>
> > >
> > >     PR fortran/89100
> > >     * io/format.c (parse_format_list): set default width when the
> > >     IOPARM_DT_DEC_EXT flag is set for i, f and g.
> > >     * io/io.h: add default_width_for_integer, default_width_for_float
> > >     and default_precision_for_float.
> > >     * io/write.c (write_boz): extra parameter giving length of data
> > >     corresponding to the type's kind.
> > >     (write_b): pass data length as extra parameter in calls to write_boz.
> > >     (write_o): pass data length as extra parameter in calls to write_boz.
> > >     (write_z): pass data length as extra parameter in calls to write_boz.
> > >     (size_from_kind): also set size is default width is set.
> > >     * io/write_float.def (build_float_string): new paramter inserted
> > > before
> > >     result parameter. If default width use values passed instead of the
> > >     values in fnode.
> > >     (FORMAT_FLOAT): macro modified to check for default width and
> > > calls to
> > >     build_float_string to pass in default width.
> > >     (get_float_string): set width and precision to defaults when needed.
> > >
> > >
> > ping?
>
>
> Committed as r271511.
>

Hi,

I've noticed new failures on arm:
    gfortran.dg/fmt_f_default_field_width_1.f90   -O0  (test for excess errors)
    gfortran.dg/fmt_f_default_field_width_1.f90   -O1  (test for excess errors)
    gfortran.dg/fmt_f_default_field_width_1.f90   -O2  (test for excess errors)
    gfortran.dg/fmt_f_default_field_width_1.f90   -O3
-fomit-frame-pointer -funroll-loops -fpeel-loops -ftracer
-finline-functions  (test for excess errors)
    gfortran.dg/fmt_f_default_field_width_1.f90   -O3 -g  (test for
excess errors)
    gfortran.dg/fmt_f_default_field_width_1.f90   -Os  (test for excess errors)
    gfortran.dg/fmt_f_default_field_width_2.f90   -O0  (test for excess errors)
    gfortran.dg/fmt_f_default_field_width_2.f90   -O1  (test for excess errors)
    gfortran.dg/fmt_f_default_field_width_2.f90   -O2  (test for excess errors)
    gfortran.dg/fmt_f_default_field_width_2.f90   -O3
-fomit-frame-pointer -funroll-loops -fpeel-loops -ftracer
-finline-functions  (test for excess errors)
    gfortran.dg/fmt_f_default_field_width_2.f90   -O3 -g  (test for
excess errors)
    gfortran.dg/fmt_f_default_field_width_2.f90   -Os  (test for excess errors)
    gfortran.dg/fmt_f_default_field_width_3.f90   -O  (test for excess errors)
    gfortran.dg/fmt_g_default_field_width_1.f90   -O0  (test for excess errors)
    gfortran.dg/fmt_g_default_field_width_1.f90   -O1  (test for excess errors)
    gfortran.dg/fmt_g_default_field_width_1.f90   -O2  (test for excess errors)
    gfortran.dg/fmt_g_default_field_width_1.f90   -O3
-fomit-frame-pointer -funroll-loops -fpeel-loops -ftracer
-finline-functions  (test for excess errors)
    gfortran.dg/fmt_g_default_field_width_1.f90   -O3 -g  (test for
excess errors)
    gfortran.dg/fmt_g_default_field_width_1.f90   -Os  (test for excess errors)
    gfortran.dg/fmt_g_default_field_width_2.f90   -O0  (test for excess errors)
    gfortran.dg/fmt_g_default_field_width_2.f90   -O1  (test for excess errors)
    gfortran.dg/fmt_g_default_field_width_2.f90   -O2  (test for excess errors)
    gfortran.dg/fmt_g_default_field_width_2.f90   -O3
-fomit-frame-pointer -funroll-loops -fpeel-loops -ftracer
-finline-functions  (test for excess errors)
    gfortran.dg/fmt_g_default_field_width_2.f90   -O3 -g  (test for
excess errors)
    gfortran.dg/fmt_g_default_field_width_2.f90   -Os  (test for excess errors)
    gfortran.dg/fmt_g_default_field_width_3.f90   -O  (test for excess errors)


The logs contain:
/gcc/testsuite/gfortran.dg/fmt_f_default_field_width_1.f90:15:11:
Error: Kind 16 not supported for type REAL at (1)

Christophe

> --
> Janne Blomqvist

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: *ping* Re: [PATCH] PR fortran/89100 Default widths for i, f and g format specifiers in format strings
  2019-05-23 10:38     ` Christophe Lyon
@ 2019-05-23 13:54       ` Mark Eggleston
  2019-05-23 15:27         ` Christophe Lyon
  2019-05-23 13:58       ` Steve Kargl
  1 sibling, 1 reply; 13+ messages in thread
From: Mark Eggleston @ 2019-05-23 13:54 UTC (permalink / raw)
  To: Christophe Lyon, Janne Blomqvist; +Cc: gcc-patches, fortran

[-- Attachment #1: Type: text/plain, Size: 5997 bytes --]

On 23/05/2019 11:38, Christophe Lyon wrote:
> On Wed, 22 May 2019 at 13:57, Janne Blomqvist <blomqvist.janne@gmail.com> wrote:
>> On Wed, May 22, 2019 at 10:58 AM Mark Eggleston
>> <mark.eggleston@codethink.co.uk> wrote:
>>> On 13/05/2019 10:45, Mark Eggleston wrote:
>>>> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89100 see comment 4
>>>>
>>>> Please can someone commit the attached patch as I do not have commit
>>>> rights.
>>>>
>>>> Change logs:
>>>>
>>>> For gcc/fortran
>>>>
>>>>      Jeff Law  <law@redhat.com>
>>>>      Mark Eggleston  <mark.eggleston@codethink.com>
>>>>
>>>>      PR fortran/89100
>>>>      * gfortran.texi: Add Default widths for F, G and I format descriptors
>>>>      to Extensions section.
>>>>      * invoke.texi: Add -fdec-format-defaults
>>>>      * io.c (check_format): Use default widths for i, f and g when
>>>>      flag_dec_format_defaults is enabled.
>>>>      * lang.opt: Add new option.
>>>>      * options.c (set_dec_flags): Add SET_BITFLAG for
>>>>      flag_dec_format_defaults.
>>>>
>>>> For gcc/testsuite
>>>>
>>>>      Mark Eggleston <mark.eggleston@codethink.com>
>>>>
>>>>      PR fortran/89100
>>>>      * gfortran.dg/fmt_f_default_field_width_1.f90: New test.
>>>>      * gfortran.dg/fmt_f_default_field_width_2.f90: New test.
>>>>      * gfortran.dg/fmt_f_default_field_width_3.f90: New test.
>>>>      * gfortran.dg/fmt_g_default_field_width_1.f90: New test.
>>>>      * gfortran.dg/fmt_g_default_field_width_2.f90: New test.
>>>>      * gfortran.dg/fmt_g_default_field_width_3.f90: New test.
>>>>      * gfortran.dg/fmt_i_default_field_width_1.f90: New test.
>>>>      * gfortran.dg/fmt_i_default_field_width_2.f90: New test.
>>>>      * gfortran.dg/fmt_i_default_field_width_3.f90: New test.
>>>>
>>>> For libgfortran
>>>>
>>>>      Jeff Law  <law@redhat.com>
>>>>
>>>>      PR fortran/89100
>>>>      * io/format.c (parse_format_list): set default width when the
>>>>      IOPARM_DT_DEC_EXT flag is set for i, f and g.
>>>>      * io/io.h: add default_width_for_integer, default_width_for_float
>>>>      and default_precision_for_float.
>>>>      * io/write.c (write_boz): extra parameter giving length of data
>>>>      corresponding to the type's kind.
>>>>      (write_b): pass data length as extra parameter in calls to write_boz.
>>>>      (write_o): pass data length as extra parameter in calls to write_boz.
>>>>      (write_z): pass data length as extra parameter in calls to write_boz.
>>>>      (size_from_kind): also set size is default width is set.
>>>>      * io/write_float.def (build_float_string): new paramter inserted
>>>> before
>>>>      result parameter. If default width use values passed instead of the
>>>>      values in fnode.
>>>>      (FORMAT_FLOAT): macro modified to check for default width and
>>>> calls to
>>>>      build_float_string to pass in default width.
>>>>      (get_float_string): set width and precision to defaults when needed.
>>>>
>>>>
>>> ping?
>>
>> Committed as r271511.
>>
> Hi,
>
> I've noticed new failures on arm:
>      gfortran.dg/fmt_f_default_field_width_1.f90   -O0  (test for excess errors)
>      gfortran.dg/fmt_f_default_field_width_1.f90   -O1  (test for excess errors)
>      gfortran.dg/fmt_f_default_field_width_1.f90   -O2  (test for excess errors)
>      gfortran.dg/fmt_f_default_field_width_1.f90   -O3
> -fomit-frame-pointer -funroll-loops -fpeel-loops -ftracer
> -finline-functions  (test for excess errors)
>      gfortran.dg/fmt_f_default_field_width_1.f90   -O3 -g  (test for
> excess errors)
>      gfortran.dg/fmt_f_default_field_width_1.f90   -Os  (test for excess errors)
>      gfortran.dg/fmt_f_default_field_width_2.f90   -O0  (test for excess errors)
>      gfortran.dg/fmt_f_default_field_width_2.f90   -O1  (test for excess errors)
>      gfortran.dg/fmt_f_default_field_width_2.f90   -O2  (test for excess errors)
>      gfortran.dg/fmt_f_default_field_width_2.f90   -O3
> -fomit-frame-pointer -funroll-loops -fpeel-loops -ftracer
> -finline-functions  (test for excess errors)
>      gfortran.dg/fmt_f_default_field_width_2.f90   -O3 -g  (test for
> excess errors)
>      gfortran.dg/fmt_f_default_field_width_2.f90   -Os  (test for excess errors)
>      gfortran.dg/fmt_f_default_field_width_3.f90   -O  (test for excess errors)
>      gfortran.dg/fmt_g_default_field_width_1.f90   -O0  (test for excess errors)
>      gfortran.dg/fmt_g_default_field_width_1.f90   -O1  (test for excess errors)
>      gfortran.dg/fmt_g_default_field_width_1.f90   -O2  (test for excess errors)
>      gfortran.dg/fmt_g_default_field_width_1.f90   -O3
> -fomit-frame-pointer -funroll-loops -fpeel-loops -ftracer
> -finline-functions  (test for excess errors)
>      gfortran.dg/fmt_g_default_field_width_1.f90   -O3 -g  (test for
> excess errors)
>      gfortran.dg/fmt_g_default_field_width_1.f90   -Os  (test for excess errors)
>      gfortran.dg/fmt_g_default_field_width_2.f90   -O0  (test for excess errors)
>      gfortran.dg/fmt_g_default_field_width_2.f90   -O1  (test for excess errors)
>      gfortran.dg/fmt_g_default_field_width_2.f90   -O2  (test for excess errors)
>      gfortran.dg/fmt_g_default_field_width_2.f90   -O3
> -fomit-frame-pointer -funroll-loops -fpeel-loops -ftracer
> -finline-functions  (test for excess errors)
>      gfortran.dg/fmt_g_default_field_width_2.f90   -O3 -g  (test for
> excess errors)
>      gfortran.dg/fmt_g_default_field_width_2.f90   -Os  (test for excess errors)
>      gfortran.dg/fmt_g_default_field_width_3.f90   -O  (test for excess errors)
>
>
> The logs contain:
> /gcc/testsuite/gfortran.dg/fmt_f_default_field_width_1.f90:15:11:
> Error: Kind 16 not supported for type REAL at (1)
>
> Christophe

Apologies, I'd forgotten that kind=16 is not always defined. The 
attached patch modifies the test cases to take this into account. I 
currently have no means of verifying this.

Please confirm that this patch solves the problem.

Mark
>> --
>> Janne Blomqvist

-- 
https://www.codethink.co.uk/privacy.html


[-- Attachment #2: 0001-Correct-test-cases-for-default-fields-where-kind-16-.patch --]
[-- Type: text/x-patch, Size: 6871 bytes --]

From ecd9ea5f505dd839e311f1496094d87f805d075f Mon Sep 17 00:00:00 2001
From: Mark Eggleston <markeggleston@codethink.com>
Date: Thu, 23 May 2019 14:30:35 +0100
Subject: [PATCH] Correct test cases for default fields where kind=16 is
 missing

---
 gcc/testsuite/gfortran.dg/fmt_f_default_field_width_1.f90 | 7 ++++++-
 gcc/testsuite/gfortran.dg/fmt_f_default_field_width_2.f90 | 7 ++++++-
 gcc/testsuite/gfortran.dg/fmt_f_default_field_width_3.f90 | 7 ++++++-
 gcc/testsuite/gfortran.dg/fmt_g_default_field_width_1.f90 | 7 ++++++-
 gcc/testsuite/gfortran.dg/fmt_g_default_field_width_2.f90 | 7 ++++++-
 gcc/testsuite/gfortran.dg/fmt_g_default_field_width_3.f90 | 7 ++++++-
 6 files changed, 36 insertions(+), 6 deletions(-)

diff --git a/gcc/testsuite/gfortran.dg/fmt_f_default_field_width_1.f90 b/gcc/testsuite/gfortran.dg/fmt_f_default_field_width_1.f90
index 5c0834211ff..a2b14b7fee6 100644
--- a/gcc/testsuite/gfortran.dg/fmt_f_default_field_width_1.f90
+++ b/gcc/testsuite/gfortran.dg/fmt_f_default_field_width_1.f90
@@ -1,5 +1,5 @@
 ! { dg-do run }
-! { dg-options -fdec }
+! { dg-options "-cpp -fdec" }
 !
 ! Test case for the default field widths enabled by the -fdec-format-defaults flag.
 !
@@ -8,11 +8,14 @@
 !
 
 program test
+    implicit none
     character(50) :: buffer
 
     real(4) :: real_4
     real(8) :: real_8
+#ifdef __GFC_REAL_16__
     real(16) :: real_16
+#endif
     integer :: len
     character(*), parameter :: fmt = "(A, F, A)"
 
@@ -32,9 +35,11 @@ program test
     len = len_trim(buffer)
     if (len /= 27) stop 3
 
+#ifdef __GFC_REAL_16__
     real_16 = 4.18
     write(buffer, fmt) ':',real_16,':'
     print *,buffer
     len = len_trim(buffer)
     if (len /= 44) stop 4
+#endif
 end
diff --git a/gcc/testsuite/gfortran.dg/fmt_f_default_field_width_2.f90 b/gcc/testsuite/gfortran.dg/fmt_f_default_field_width_2.f90
index fd5b1d25a56..1896197580a 100644
--- a/gcc/testsuite/gfortran.dg/fmt_f_default_field_width_2.f90
+++ b/gcc/testsuite/gfortran.dg/fmt_f_default_field_width_2.f90
@@ -1,5 +1,5 @@
 ! { dg-do run }
-! { dg-options -fdec-format-defaults }
+! { dg-options "-cpp -fdec-format-defaults" }
 !
 ! Test case for the default field widths enabled by the -fdec-format-defaults flag.
 !
@@ -11,11 +11,14 @@
 !
 
 program test
+    implicit none
     character(50) :: buffer
 
     real(4) :: real_4
     real(8) :: real_8
+#ifdef __GFC_REAL_16__
     real(16) :: real_16
+#endif
     integer :: len
     character(*), parameter :: fmt = "(A, F, A)"
 
@@ -35,9 +38,11 @@ program test
     len = len_trim(buffer)
     if (len /= 27) stop 3
 
+#ifdef __GFC_REAL_16__
     real_16 = 4.18
     write(buffer, fmt) ':',real_16,':'
     print *,buffer
     len = len_trim(buffer)
     if (len /= 44) stop 4
+#endif
 end
diff --git a/gcc/testsuite/gfortran.dg/fmt_f_default_field_width_3.f90 b/gcc/testsuite/gfortran.dg/fmt_f_default_field_width_3.f90
index 6852f8e9aa2..81ed35255ba 100644
--- a/gcc/testsuite/gfortran.dg/fmt_f_default_field_width_3.f90
+++ b/gcc/testsuite/gfortran.dg/fmt_f_default_field_width_3.f90
@@ -1,5 +1,5 @@
 ! { dg-do compile }
-! { dg-options "-fdec -fno-dec-format-defaults" }
+! { dg-options "-cpp -fdec -fno-dec-format-defaults" }
 !
 ! Test case for the default field widths not enabled.
 !
@@ -8,11 +8,14 @@
 !
 
 program test
+    implicit none
     character(50) :: buffer
 
     real*4 :: real_4
     real*8 :: real_8
+#ifdef __GFC_REAL_16__
     real*16 :: real_16
+#endif
     integer :: len
     character(*), parameter :: fmt = "(A, F, A)"
 
@@ -25,6 +28,8 @@ program test
     real_8 = 4.18
     write(buffer, fmt) ':',real_8,':' ! { dg-error "Nonnegative width required" }
 
+#ifdef __GFC_REAL_16__
     real_16 = 4.18
     write(buffer, fmt) ':',real_16,':' ! { dg-error "Nonnegative width required" }
+#endif
 end
diff --git a/gcc/testsuite/gfortran.dg/fmt_g_default_field_width_1.f90 b/gcc/testsuite/gfortran.dg/fmt_g_default_field_width_1.f90
index 028cd113929..859e648ac39 100644
--- a/gcc/testsuite/gfortran.dg/fmt_g_default_field_width_1.f90
+++ b/gcc/testsuite/gfortran.dg/fmt_g_default_field_width_1.f90
@@ -1,5 +1,5 @@
 ! { dg-do run }
-! { dg-options -fdec }
+! { dg-options "-cpp -fdec" }
 !
 ! Test case for the default field widths enabled by the -fdec-format-defaults flag.
 !
@@ -8,11 +8,14 @@
 !
 
 program test
+    implicit none
     character(50) :: buffer
 
     real(4) :: real_4
     real(8) :: real_8
+#ifdef __GFC_REAL_16__
     real(16) :: real_16
+#endif
     integer :: len
     character(*), parameter :: fmt = "(A, G, A)"
 
@@ -37,9 +40,11 @@ program test
     len = len_trim(buffer)
     if (len /= 27) stop 4
 
+#ifdef __GFC_REAL_16__
     real_16 = 4.18
     write(buffer, fmt) ':',real_16,':'
     print *,buffer
     len = len_trim(buffer)
     if (len /= 44) stop 5
+#endif
 end
diff --git a/gcc/testsuite/gfortran.dg/fmt_g_default_field_width_2.f90 b/gcc/testsuite/gfortran.dg/fmt_g_default_field_width_2.f90
index 45c98c7c300..207dcc7ce09 100644
--- a/gcc/testsuite/gfortran.dg/fmt_g_default_field_width_2.f90
+++ b/gcc/testsuite/gfortran.dg/fmt_g_default_field_width_2.f90
@@ -1,5 +1,5 @@
 ! { dg-do run }
-! { dg-options -fdec-format-defaults }
+! { dg-options "-cpp -fdec-format-defaults" }
 !
 ! Test case for the default field widths enabled by the -fdec-format-defaults flag.
 !
@@ -11,11 +11,14 @@
 !
 
 program test
+    implicit none
     character(50) :: buffer
 
     real(4) :: real_4
     real(8) :: real_8
+#ifdef __GFC_REAL_16__
     real(16) :: real_16
+#endif
     integer :: len
     character(*), parameter :: fmt = "(A, G, A)"
 
@@ -40,9 +43,11 @@ program test
     len = len_trim(buffer)
     if (len /= 27) stop 4
 
+#ifdef __GFC_REAL_16__
     real_16 = 4.18
     write(buffer, fmt) ':',real_16,':'
     print *,buffer
     len = len_trim(buffer)
     if (len /= 44) stop 5
+#endif
 end
diff --git a/gcc/testsuite/gfortran.dg/fmt_g_default_field_width_3.f90 b/gcc/testsuite/gfortran.dg/fmt_g_default_field_width_3.f90
index 3db4fddd162..1fea3957c7a 100644
--- a/gcc/testsuite/gfortran.dg/fmt_g_default_field_width_3.f90
+++ b/gcc/testsuite/gfortran.dg/fmt_g_default_field_width_3.f90
@@ -1,5 +1,5 @@
 ! { dg-do compile }
-! { dg-options "-fdec -fno-dec-format-defaults" }
+! { dg-options "-cpp -fdec -fno-dec-format-defaults" }
 !
 ! Test case for the default field widths not enabled.
 !
@@ -8,11 +8,14 @@
 !
 
 program test
+    implicit none
     character(50) :: buffer
 
     real(4) :: real_4
     real(8) :: real_8
+#ifdef __GFC_REAL_16__
     real(16) :: real_16
+#endif
     integer :: len
     character(*), parameter :: fmt = "(A, G, A)"
 
@@ -28,6 +31,8 @@ program test
     real_8 = 4.18
     write(buffer, fmt) ':',real_8,':' ! { dg-error "Positive width required" }
 
+#ifdef __GFC_REAL_16__
     real_16 = 4.18
     write(buffer, fmt) ':',real_16,':' ! { dg-error "Positive width required" }
+#endif
 end
-- 
2.11.0


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: *ping* Re: [PATCH] PR fortran/89100 Default widths for i, f and g format specifiers in format strings
  2019-05-23 10:38     ` Christophe Lyon
  2019-05-23 13:54       ` Mark Eggleston
@ 2019-05-23 13:58       ` Steve Kargl
  1 sibling, 0 replies; 13+ messages in thread
From: Steve Kargl @ 2019-05-23 13:58 UTC (permalink / raw)
  To: Christophe Lyon; +Cc: Janne Blomqvist, Mark Eggleston, gcc-patches, fortran

On Thu, May 23, 2019 at 12:38:12PM +0200, Christophe Lyon wrote:
> On Wed, 22 May 2019 at 13:57, Janne Blomqvist <blomqvist.janne@gmail.com> wrote:
> >
> > > >     * gfortran.dg/fmt_f_default_field_width_1.f90: New test.
> > > >     * gfortran.dg/fmt_f_default_field_width_2.f90: New test.
> > > >     * gfortran.dg/fmt_f_default_field_width_3.f90: New test.
> > > >     * gfortran.dg/fmt_g_default_field_width_1.f90: New test.
> > > >     * gfortran.dg/fmt_g_default_field_width_2.f90: New test.
> > > >     * gfortran.dg/fmt_g_default_field_width_3.f90: New test.
> > > >     * gfortran.dg/fmt_i_default_field_width_1.f90: New test.
> > > >     * gfortran.dg/fmt_i_default_field_width_2.f90: New test.
> 
> The logs contain:
> /gcc/testsuite/gfortran.dg/fmt_f_default_field_width_1.f90:15:11:
> Error: Kind 16 not supported for type REAL at (1)
> 

The offending files should be 'svn mv' *.f90 to *.F90.
The the REAL(16) tests can be conditionally included 
with 

#ifdef __GFC_REAL_16__
#endif

-- 
Steve

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: *ping* Re: [PATCH] PR fortran/89100 Default widths for i, f and g format specifiers in format strings
  2019-05-23 13:54       ` Mark Eggleston
@ 2019-05-23 15:27         ` Christophe Lyon
  2019-05-23 17:21           ` Steve Kargl
  0 siblings, 1 reply; 13+ messages in thread
From: Christophe Lyon @ 2019-05-23 15:27 UTC (permalink / raw)
  To: Mark Eggleston; +Cc: Janne Blomqvist, gcc-patches, fortran

On Thu, 23 May 2019 at 15:54, Mark Eggleston
<mark.eggleston@codethink.co.uk> wrote:
>
> On 23/05/2019 11:38, Christophe Lyon wrote:
> > On Wed, 22 May 2019 at 13:57, Janne Blomqvist <blomqvist.janne@gmail.com> wrote:
> >> On Wed, May 22, 2019 at 10:58 AM Mark Eggleston
> >> <mark.eggleston@codethink.co.uk> wrote:
> >>> On 13/05/2019 10:45, Mark Eggleston wrote:
> >>>> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89100 see comment 4
> >>>>
> >>>> Please can someone commit the attached patch as I do not have commit
> >>>> rights.
> >>>>
> >>>> Change logs:
> >>>>
> >>>> For gcc/fortran
> >>>>
> >>>>      Jeff Law  <law@redhat.com>
> >>>>      Mark Eggleston  <mark.eggleston@codethink.com>
> >>>>
> >>>>      PR fortran/89100
> >>>>      * gfortran.texi: Add Default widths for F, G and I format descriptors
> >>>>      to Extensions section.
> >>>>      * invoke.texi: Add -fdec-format-defaults
> >>>>      * io.c (check_format): Use default widths for i, f and g when
> >>>>      flag_dec_format_defaults is enabled.
> >>>>      * lang.opt: Add new option.
> >>>>      * options.c (set_dec_flags): Add SET_BITFLAG for
> >>>>      flag_dec_format_defaults.
> >>>>
> >>>> For gcc/testsuite
> >>>>
> >>>>      Mark Eggleston <mark.eggleston@codethink.com>
> >>>>
> >>>>      PR fortran/89100
> >>>>      * gfortran.dg/fmt_f_default_field_width_1.f90: New test.
> >>>>      * gfortran.dg/fmt_f_default_field_width_2.f90: New test.
> >>>>      * gfortran.dg/fmt_f_default_field_width_3.f90: New test.
> >>>>      * gfortran.dg/fmt_g_default_field_width_1.f90: New test.
> >>>>      * gfortran.dg/fmt_g_default_field_width_2.f90: New test.
> >>>>      * gfortran.dg/fmt_g_default_field_width_3.f90: New test.
> >>>>      * gfortran.dg/fmt_i_default_field_width_1.f90: New test.
> >>>>      * gfortran.dg/fmt_i_default_field_width_2.f90: New test.
> >>>>      * gfortran.dg/fmt_i_default_field_width_3.f90: New test.
> >>>>
> >>>> For libgfortran
> >>>>
> >>>>      Jeff Law  <law@redhat.com>
> >>>>
> >>>>      PR fortran/89100
> >>>>      * io/format.c (parse_format_list): set default width when the
> >>>>      IOPARM_DT_DEC_EXT flag is set for i, f and g.
> >>>>      * io/io.h: add default_width_for_integer, default_width_for_float
> >>>>      and default_precision_for_float.
> >>>>      * io/write.c (write_boz): extra parameter giving length of data
> >>>>      corresponding to the type's kind.
> >>>>      (write_b): pass data length as extra parameter in calls to write_boz.
> >>>>      (write_o): pass data length as extra parameter in calls to write_boz.
> >>>>      (write_z): pass data length as extra parameter in calls to write_boz.
> >>>>      (size_from_kind): also set size is default width is set.
> >>>>      * io/write_float.def (build_float_string): new paramter inserted
> >>>> before
> >>>>      result parameter. If default width use values passed instead of the
> >>>>      values in fnode.
> >>>>      (FORMAT_FLOAT): macro modified to check for default width and
> >>>> calls to
> >>>>      build_float_string to pass in default width.
> >>>>      (get_float_string): set width and precision to defaults when needed.
> >>>>
> >>>>
> >>> ping?
> >>
> >> Committed as r271511.
> >>
> > Hi,
> >
> > I've noticed new failures on arm:
> >      gfortran.dg/fmt_f_default_field_width_1.f90   -O0  (test for excess errors)
> >      gfortran.dg/fmt_f_default_field_width_1.f90   -O1  (test for excess errors)
> >      gfortran.dg/fmt_f_default_field_width_1.f90   -O2  (test for excess errors)
> >      gfortran.dg/fmt_f_default_field_width_1.f90   -O3
> > -fomit-frame-pointer -funroll-loops -fpeel-loops -ftracer
> > -finline-functions  (test for excess errors)
> >      gfortran.dg/fmt_f_default_field_width_1.f90   -O3 -g  (test for
> > excess errors)
> >      gfortran.dg/fmt_f_default_field_width_1.f90   -Os  (test for excess errors)
> >      gfortran.dg/fmt_f_default_field_width_2.f90   -O0  (test for excess errors)
> >      gfortran.dg/fmt_f_default_field_width_2.f90   -O1  (test for excess errors)
> >      gfortran.dg/fmt_f_default_field_width_2.f90   -O2  (test for excess errors)
> >      gfortran.dg/fmt_f_default_field_width_2.f90   -O3
> > -fomit-frame-pointer -funroll-loops -fpeel-loops -ftracer
> > -finline-functions  (test for excess errors)
> >      gfortran.dg/fmt_f_default_field_width_2.f90   -O3 -g  (test for
> > excess errors)
> >      gfortran.dg/fmt_f_default_field_width_2.f90   -Os  (test for excess errors)
> >      gfortran.dg/fmt_f_default_field_width_3.f90   -O  (test for excess errors)
> >      gfortran.dg/fmt_g_default_field_width_1.f90   -O0  (test for excess errors)
> >      gfortran.dg/fmt_g_default_field_width_1.f90   -O1  (test for excess errors)
> >      gfortran.dg/fmt_g_default_field_width_1.f90   -O2  (test for excess errors)
> >      gfortran.dg/fmt_g_default_field_width_1.f90   -O3
> > -fomit-frame-pointer -funroll-loops -fpeel-loops -ftracer
> > -finline-functions  (test for excess errors)
> >      gfortran.dg/fmt_g_default_field_width_1.f90   -O3 -g  (test for
> > excess errors)
> >      gfortran.dg/fmt_g_default_field_width_1.f90   -Os  (test for excess errors)
> >      gfortran.dg/fmt_g_default_field_width_2.f90   -O0  (test for excess errors)
> >      gfortran.dg/fmt_g_default_field_width_2.f90   -O1  (test for excess errors)
> >      gfortran.dg/fmt_g_default_field_width_2.f90   -O2  (test for excess errors)
> >      gfortran.dg/fmt_g_default_field_width_2.f90   -O3
> > -fomit-frame-pointer -funroll-loops -fpeel-loops -ftracer
> > -finline-functions  (test for excess errors)
> >      gfortran.dg/fmt_g_default_field_width_2.f90   -O3 -g  (test for
> > excess errors)
> >      gfortran.dg/fmt_g_default_field_width_2.f90   -Os  (test for excess errors)
> >      gfortran.dg/fmt_g_default_field_width_3.f90   -O  (test for excess errors)
> >
> >
> > The logs contain:
> > /gcc/testsuite/gfortran.dg/fmt_f_default_field_width_1.f90:15:11:
> > Error: Kind 16 not supported for type REAL at (1)
> >
> > Christophe
>
> Apologies, I'd forgotten that kind=16 is not always defined. The
> attached patch modifies the test cases to take this into account. I
> currently have no means of verifying this.
>
> Please confirm that this patch solves the problem.
>

I confirm this patch does fix the problem, thanks

Christophe

> Mark
> >> --
> >> Janne Blomqvist
>
> --
> https://www.codethink.co.uk/privacy.html
>

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: *ping* Re: [PATCH] PR fortran/89100 Default widths for i, f and g format specifiers in format strings
  2019-05-23 15:27         ` Christophe Lyon
@ 2019-05-23 17:21           ` Steve Kargl
  2019-05-24  9:06             ` Christophe Lyon
  0 siblings, 1 reply; 13+ messages in thread
From: Steve Kargl @ 2019-05-23 17:21 UTC (permalink / raw)
  To: Christophe Lyon; +Cc: Mark Eggleston, Janne Blomqvist, gcc-patches, fortran

On Thu, May 23, 2019 at 05:26:53PM +0200, Christophe Lyon wrote:
> On Thu, 23 May 2019 at 15:54, Mark Eggleston
> <mark.eggleston@codethink.co.uk> wrote:
> > >
> > > The logs contain:
> > > /gcc/testsuite/gfortran.dg/fmt_f_default_field_width_1.f90:15:11:
> > > Error: Kind 16 not supported for type REAL at (1)
> > >
> > > Christophe
> >
> > Apologies, I'd forgotten that kind=16 is not always defined. The
> > attached patch modifies the test cases to take this into account. I
> > currently have no means of verifying this.
> >
> > Please confirm that this patch solves the problem.
> >
> 
> I confirm this patch does fix the problem, thanks
> 

Patch committed as r271573.

-- 
Steve

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: *ping* Re: [PATCH] PR fortran/89100 Default widths for i, f and g format specifiers in format strings
  2019-05-23 17:21           ` Steve Kargl
@ 2019-05-24  9:06             ` Christophe Lyon
  2019-05-24 10:28               ` Mark Eggleston
  0 siblings, 1 reply; 13+ messages in thread
From: Christophe Lyon @ 2019-05-24  9:06 UTC (permalink / raw)
  To: sgk; +Cc: Mark Eggleston, Janne Blomqvist, gcc-patches, fortran

On Thu, 23 May 2019 at 19:21, Steve Kargl
<sgk@troutmask.apl.washington.edu> wrote:
>
> On Thu, May 23, 2019 at 05:26:53PM +0200, Christophe Lyon wrote:
> > On Thu, 23 May 2019 at 15:54, Mark Eggleston
> > <mark.eggleston@codethink.co.uk> wrote:
> > > >
> > > > The logs contain:
> > > > /gcc/testsuite/gfortran.dg/fmt_f_default_field_width_1.f90:15:11:
> > > > Error: Kind 16 not supported for type REAL at (1)
> > > >
> > > > Christophe
> > >
> > > Apologies, I'd forgotten that kind=16 is not always defined. The
> > > attached patch modifies the test cases to take this into account. I
> > > currently have no means of verifying this.
> > >
> > > Please confirm that this patch solves the problem.
> > >
> >
> > I confirm this patch does fix the problem, thanks
> >
>
> Patch committed as r271573.
>

Hi,

Sorry, I didn't check all the testcases you changed, and this commit
introduces a new failure on arm:
/gcc/testsuite/gfortran.dg/fmt_f_default_field_width_3.f90:23:23:
Error: Nonnegative width required in format string at (1)
/gcc/testsuite/gfortran.dg/fmt_f_default_field_width_3.f90:26:23:
Error: Nonnegative width required in format string at (1)
/gcc/testsuite/gfortran.dg/fmt_f_default_field_width_3.f90:29:23:
Error: Nonnegative width required in format string at (1)
compiler exited with status 1
PASS: gfortran.dg/fmt_f_default_field_width_3.f90   -O   (test for
errors, line 23)
PASS: gfortran.dg/fmt_f_default_field_width_3.f90   -O   (test for
errors, line 26)
PASS: gfortran.dg/fmt_f_default_field_width_3.f90   -O   (test for
errors, line 29)
FAIL: gfortran.dg/fmt_f_default_field_width_3.f90   -O   (test for
errors, line 33)
PASS: gfortran.dg/fmt_f_default_field_width_3.f90   -O  (test for excess errors)

that is, it seems there's no error message generated for line 33.

Christophe

> --
> Steve

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: *ping* Re: [PATCH] PR fortran/89100 Default widths for i, f and g format specifiers in format strings
  2019-05-24  9:06             ` Christophe Lyon
@ 2019-05-24 10:28               ` Mark Eggleston
  2019-05-24 10:34                 ` Jakub Jelinek
  0 siblings, 1 reply; 13+ messages in thread
From: Mark Eggleston @ 2019-05-24 10:28 UTC (permalink / raw)
  To: Christophe Lyon, sgk; +Cc: Janne Blomqvist, gcc-patches, fortran

On 24/05/2019 10:06, Christophe Lyon wrote:
> On Thu, 23 May 2019 at 19:21, Steve Kargl
> <sgk@troutmask.apl.washington.edu> wrote:
>> On Thu, May 23, 2019 at 05:26:53PM +0200, Christophe Lyon wrote:
>>> On Thu, 23 May 2019 at 15:54, Mark Eggleston
>>> <mark.eggleston@codethink.co.uk> wrote:
>>>>> The logs contain:
>>>>> /gcc/testsuite/gfortran.dg/fmt_f_default_field_width_1.f90:15:11:
>>>>> Error: Kind 16 not supported for type REAL at (1)
>>>>>
>>>>> Christophe
>>>> Apologies, I'd forgotten that kind=16 is not always defined. The
>>>> attached patch modifies the test cases to take this into account. I
>>>> currently have no means of verifying this.
>>>>
>>>> Please confirm that this patch solves the problem.
>>>>
>>> I confirm this patch does fix the problem, thanks
>>>
>> Patch committed as r271573.
>>
> Hi,
>
> Sorry, I didn't check all the testcases you changed, and this commit
> introduces a new failure on arm:
> /gcc/testsuite/gfortran.dg/fmt_f_default_field_width_3.f90:23:23:
> Error: Nonnegative width required in format string at (1)
> /gcc/testsuite/gfortran.dg/fmt_f_default_field_width_3.f90:26:23:
> Error: Nonnegative width required in format string at (1)
> /gcc/testsuite/gfortran.dg/fmt_f_default_field_width_3.f90:29:23:
> Error: Nonnegative width required in format string at (1)
> compiler exited with status 1
> PASS: gfortran.dg/fmt_f_default_field_width_3.f90   -O   (test for
> errors, line 23)
> PASS: gfortran.dg/fmt_f_default_field_width_3.f90   -O   (test for
> errors, line 26)
> PASS: gfortran.dg/fmt_f_default_field_width_3.f90   -O   (test for
> errors, line 29)
> FAIL: gfortran.dg/fmt_f_default_field_width_3.f90   -O   (test for
> errors, line 33)
> PASS: gfortran.dg/fmt_f_default_field_width_3.f90   -O  (test for excess errors)
>
> that is, it seems there's no error message generated for line 33.
>
> Christophe
>

There is no error for line 33 because it isn't included in the 
compilation because __GFC_REAL_16__ isn't defined. DejaGnu doesn't know 
this and the dg-warning directive for this line is still processed.

I don't know enough about DejaGnu directives to determine whether this 
situation can be handled. Does anybody know how to deal with a line that 
if compiled a warning message output and if not compiled there is no output?

Is the easiest solution to omit the test code where kind=16?

Mark

>> --
>> Steve

-- 
https://www.codethink.co.uk/privacy.html

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: *ping* Re: [PATCH] PR fortran/89100 Default widths for i, f and g format specifiers in format strings
  2019-05-24 10:28               ` Mark Eggleston
@ 2019-05-24 10:34                 ` Jakub Jelinek
  2019-05-24 14:25                   ` Steve Kargl
  0 siblings, 1 reply; 13+ messages in thread
From: Jakub Jelinek @ 2019-05-24 10:34 UTC (permalink / raw)
  To: Mark Eggleston
  Cc: Christophe Lyon, sgk, Janne Blomqvist, gcc-patches, fortran

On Fri, May 24, 2019 at 11:28:34AM +0100, Mark Eggleston wrote:
> > FAIL: gfortran.dg/fmt_f_default_field_width_3.f90   -O   (test for
> > errors, line 33)
> > PASS: gfortran.dg/fmt_f_default_field_width_3.f90   -O  (test for excess errors)
> > 
> > that is, it seems there's no error message generated for line 33.
> > 
> > Christophe
> > 
> 
> There is no error for line 33 because it isn't included in the compilation
> because __GFC_REAL_16__ isn't defined. DejaGnu doesn't know this and the
> dg-warning directive for this line is still processed.
> 
> I don't know enough about DejaGnu directives to determine whether this
> situation can be handled. Does anybody know how to deal with a line that if
> compiled a warning message output and if not compiled there is no output?
> 
> Is the easiest solution to omit the test code where kind=16?

You can do (pseudo patch, untested):
 #ifdef __GFC_REAL_16__
      real_16 = 4.18
-     write(buffer, fmt) ':',real_16,':' ! { dg-error "Positive width required" }
+     write(buffer, fmt) ':',real_16,':' ! { dg-error "Positive width required" "" { target fortran_real_16 } }
 #endif

Effective target fortran_real_16 should be true whenever:
        real(kind=16) :: x
        x = cos (x)
        end
compiles and links into an executable without diagnostics.

	Jakub

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: *ping* Re: [PATCH] PR fortran/89100 Default widths for i, f and g format specifiers in format strings
  2019-05-24 10:34                 ` Jakub Jelinek
@ 2019-05-24 14:25                   ` Steve Kargl
  2019-05-27  6:42                     ` Christophe Lyon
  0 siblings, 1 reply; 13+ messages in thread
From: Steve Kargl @ 2019-05-24 14:25 UTC (permalink / raw)
  To: Jakub Jelinek
  Cc: Mark Eggleston, Christophe Lyon, Janne Blomqvist, gcc-patches, fortran

On Fri, May 24, 2019 at 12:33:51PM +0200, Jakub Jelinek wrote:
> On Fri, May 24, 2019 at 11:28:34AM +0100, Mark Eggleston wrote:
> > > FAIL: gfortran.dg/fmt_f_default_field_width_3.f90   -O   (test for
> > > errors, line 33)
> > > PASS: gfortran.dg/fmt_f_default_field_width_3.f90   -O  (test for excess errors)
> > > 
> > > that is, it seems there's no error message generated for line 33.
> > > 
> > > Christophe
> > > 
> > 
> > There is no error for line 33 because it isn't included in the compilation
> > because __GFC_REAL_16__ isn't defined. DejaGnu doesn't know this and the
> > dg-warning directive for this line is still processed.
> > 
> > I don't know enough about DejaGnu directives to determine whether this
> > situation can be handled. Does anybody know how to deal with a line that if
> > compiled a warning message output and if not compiled there is no output?
> > 
> > Is the easiest solution to omit the test code where kind=16?
> 
> You can do (pseudo patch, untested):
>  #ifdef __GFC_REAL_16__
>       real_16 = 4.18
> -     write(buffer, fmt) ':',real_16,':' ! { dg-error "Positive width required" }
> +     write(buffer, fmt) ':',real_16,':' ! { dg-error "Positive width required" "" { target fortran_real_16 } }
>  #endif
> 
> Effective target fortran_real_16 should be true whenever:
>         real(kind=16) :: x
>         x = cos (x)
>         end
> compiles and links into an executable without diagnostics.
> 

Christophe, can you test Jakub's proposed fix?  If it passes,
I'll update the other testcases.

-- 
Steve

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: *ping* Re: [PATCH] PR fortran/89100 Default widths for i, f and g format specifiers in format strings
  2019-05-24 14:25                   ` Steve Kargl
@ 2019-05-27  6:42                     ` Christophe Lyon
  0 siblings, 0 replies; 13+ messages in thread
From: Christophe Lyon @ 2019-05-27  6:42 UTC (permalink / raw)
  To: sgk; +Cc: Jakub Jelinek, Mark Eggleston, Janne Blomqvist, gcc-patches, fortran

On Fri, 24 May 2019 at 16:25, Steve Kargl
<sgk@troutmask.apl.washington.edu> wrote:
>
> On Fri, May 24, 2019 at 12:33:51PM +0200, Jakub Jelinek wrote:
> > On Fri, May 24, 2019 at 11:28:34AM +0100, Mark Eggleston wrote:
> > > > FAIL: gfortran.dg/fmt_f_default_field_width_3.f90   -O   (test for
> > > > errors, line 33)
> > > > PASS: gfortran.dg/fmt_f_default_field_width_3.f90   -O  (test for excess errors)
> > > >
> > > > that is, it seems there's no error message generated for line 33.
> > > >
> > > > Christophe
> > > >
> > >
> > > There is no error for line 33 because it isn't included in the compilation
> > > because __GFC_REAL_16__ isn't defined. DejaGnu doesn't know this and the
> > > dg-warning directive for this line is still processed.
> > >
> > > I don't know enough about DejaGnu directives to determine whether this
> > > situation can be handled. Does anybody know how to deal with a line that if
> > > compiled a warning message output and if not compiled there is no output?
> > >
> > > Is the easiest solution to omit the test code where kind=16?
> >
> > You can do (pseudo patch, untested):
> >  #ifdef __GFC_REAL_16__
> >       real_16 = 4.18
> > -     write(buffer, fmt) ':',real_16,':' ! { dg-error "Positive width required" }
> > +     write(buffer, fmt) ':',real_16,':' ! { dg-error "Positive width required" "" { target fortran_real_16 } }
> >  #endif
> >
> > Effective target fortran_real_16 should be true whenever:
> >         real(kind=16) :: x
> >         x = cos (x)
> >         end
> > compiles and links into an executable without diagnostics.
> >
>
> Christophe, can you test Jakub's proposed fix?  If it passes,
> I'll update the other testcases.
>

Yes, it's really as simple as:
diff --git a/gcc/testsuite/gfortran.dg/fmt_f_default_field_width_3.f90
b/gcc/testsuite/gfortran.dg/fmt_f_default_field_width_3.f90
index 81ed352..b924b00 100644
--- a/gcc/testsuite/gfortran.dg/fmt_f_default_field_width_3.f90
+++ b/gcc/testsuite/gfortran.dg/fmt_f_default_field_width_3.f90
@@ -30,6 +30,6 @@ program test

 #ifdef __GFC_REAL_16__
     real_16 = 4.18
-    write(buffer, fmt) ':',real_16,':' ! { dg-error "Nonnegative
width required" }
+    write(buffer, fmt) ':',real_16,':' ! { dg-error "Nonnegative
width required" "" { target fortran_real_16 } }
 #endif
 end

because check_effective_target_fortran_real_16 already exists in
target-supports.exp (since 2011!)

Christophe



> --
> Steve

^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2019-05-27  6:34 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-05-13  9:45 [PATCH] PR fortran/89100 Default widths for i, f and g format specifiers in format strings Mark Eggleston
2019-05-22  7:58 ` *ping* " Mark Eggleston
2019-05-22 11:57   ` Janne Blomqvist
2019-05-23 10:38     ` Christophe Lyon
2019-05-23 13:54       ` Mark Eggleston
2019-05-23 15:27         ` Christophe Lyon
2019-05-23 17:21           ` Steve Kargl
2019-05-24  9:06             ` Christophe Lyon
2019-05-24 10:28               ` Mark Eggleston
2019-05-24 10:34                 ` Jakub Jelinek
2019-05-24 14:25                   ` Steve Kargl
2019-05-27  6:42                     ` Christophe Lyon
2019-05-23 13:58       ` Steve Kargl

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).