Skip to content

Commit

Permalink
fortran/89100: Default widths with -fdec-format-defaults
Browse files Browse the repository at this point in the history
gcc/fortran ChangeLog:

2019-05-22  Jeff Law  <[email protected]>
            Mark Eggleston  <[email protected]>

        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.


gcc/testsuite ChangeLog:

2019-05-22  Mark Eggleston  <[email protected]>

        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.


libgfortran ChangeLog:

2019-05-22  Jeff Law  <[email protected]>

        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.



git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@271511 138bc75d-0d04-0410-961f-82ee72b054a4
  • Loading branch information
jb committed May 22, 2019
1 parent bf12813 commit 647551f
Show file tree
Hide file tree
Showing 22 changed files with 610 additions and 28 deletions.
13 changes: 13 additions & 0 deletions gcc/fortran/ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,16 @@
2019-05-22 Jeff Law <[email protected]>
Mark Eggleston <[email protected]>

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.

2019-05-21 Janne Blomqvist <[email protected]>

PR libfortran/90038
Expand Down
17 changes: 17 additions & 0 deletions gcc/fortran/gfortran.texi
Original file line number Diff line number Diff line change
Expand Up @@ -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::
Expand Down Expand Up @@ -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
Expand Down
25 changes: 15 additions & 10 deletions gcc/fortran/invoke.texi
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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{$}
Expand Down
31 changes: 27 additions & 4 deletions gcc/fortran/io.c
Original file line number Diff line number Diff line change
Expand Up @@ -903,6 +903,13 @@ check_format (bool is_input)

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),
Expand Down Expand Up @@ -1027,6 +1034,13 @@ check_format (bool is_input)
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;
}
Expand Down Expand Up @@ -1096,8 +1110,17 @@ check_format (bool is_input)
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)
{
Expand Down Expand Up @@ -4368,8 +4391,8 @@ match_io (io_kind k)
}

/* 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
Expand Down
4 changes: 4 additions & 0 deletions gcc/fortran/lang.opt
Original file line number Diff line number Diff line change
Expand Up @@ -452,6 +452,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.
Expand Down
1 change: 1 addition & 0 deletions gcc/fortran/options.c
Original file line number Diff line number Diff line change
Expand Up @@ -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. */
Expand Down
13 changes: 13 additions & 0 deletions gcc/testsuite/ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,16 @@
2019-05-22 Mark Eggleston <[email protected]>

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.

2019-05-22 Martin Liska <[email protected]>

PR testsuite/90564
Expand Down
40 changes: 40 additions & 0 deletions gcc/testsuite/gfortran.dg/fmt_f_default_field_width_1.f90
Original file line number Diff line number Diff line change
@@ -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
43 changes: 43 additions & 0 deletions gcc/testsuite/gfortran.dg/fmt_f_default_field_width_2.f90
Original file line number Diff line number Diff line change
@@ -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 <[email protected]> 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
30 changes: 30 additions & 0 deletions gcc/testsuite/gfortran.dg/fmt_f_default_field_width_3.f90
Original file line number Diff line number Diff line change
@@ -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 <[email protected]> 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
45 changes: 45 additions & 0 deletions gcc/testsuite/gfortran.dg/fmt_g_default_field_width_1.f90
Original file line number Diff line number Diff line change
@@ -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
48 changes: 48 additions & 0 deletions gcc/testsuite/gfortran.dg/fmt_g_default_field_width_2.f90
Original file line number Diff line number Diff line change
@@ -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 <[email protected]> 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
Loading

0 comments on commit 647551f

Please sign in to comment.