On 10/06/2019 15:10, Mark Eggleston wrote:
On 10/06/2019 15:07, Thomas Koenig wrote:
Am 10.06.19 um 15:33 schrieb Mark Eggleston:
This patch is for a customer that has a huge codebase and that is
the only reason for its existence.
I didn't know gfortran as a whole has customers as such :-)
The error message has not changed. Making it more informative,
indicating an option that will allow this non-standard usage, is a
bad idea as it could result in its spread.
OK, I understand that. So scrap the idea of pointing towards the
option.
However, making it more informative _without_ pointing towards that
option is still a good idea (such as "missing item in format list").
That's a much better idea. I'll implement that and when it's ready
I'll update the patch.
Patch updated and attached. ChangeLogs:
gcc/fortran
Jim MacArthur <jim.macart...@codethink.co.uk>
Mark Eggleston <mark.eggles...@codethink.com>
PR fortran/89103
* gfortran.texi: Add -fdec-blank-format-item
* invoke.texi: Add to section on Commas in FORMAT specifications.
* io.c (check_format): Add new string missing_item.
* io.c (check_format): At FMT_RPAREN goto finished if
-fdec-blank-format-item otherwise set error string to missing_item.
* lang.opt: Add new option.
* options.c (set_dec_flags): Add SET_BITFLAG for
flag_dec_format_defaults.
Jim MacArthur <jim.macart...@codethink.co.uk>
Mark Eggleston <mark.eggles...@codethink.com>
gcc/testsuite
PR fortran/89103
* gfortran.dg/dec_format_empty_item_1.f: New test.
* gfortran.dg/dec_format_empty_item_2.f: New test.
* gfortran.dg/dec_format_empty_item_3.f: New test.
If OK, please can someone commit this.
If we want to allow legacy extensions to clutter our code, getting
a more informative error message is something we can get in return,
at least.
Regards
Thomas
--
https://www.codethink.co.uk/privacy.html
>From 5a78d94a626444d4f71bcda99c5fc6ebb0509f46 Mon Sep 17 00:00:00 2001
From: Jim MacArthur <jim.macart...@codethink.co.uk>
Date: Thu, 4 Feb 2016 16:59:41 +0000
Subject: [PATCH 01/10] Allow blank format items in format strings
This has to be written in a slightly verbose manner because GCC 7
defaults to building with -Werror=implicit-fallthrough which prevents
us from just falling through to the default: case.
Test written by: Francisco Redondo Marchena <francisco.march...@codethink.co.uk>
Use -fdec-blank-format-item to enable. Also enabled by -fdec.
---
gcc/fortran/gfortran.texi | 7 ++++++-
gcc/fortran/invoke.texi | 13 +++++++++----
gcc/fortran/io.c | 11 +++++++++++
gcc/fortran/lang.opt | 4 ++++
gcc/fortran/options.c | 1 +
gcc/testsuite/gfortran.dg/dec_format_empty_item_1.f | 19 +++++++++++++++++++
gcc/testsuite/gfortran.dg/dec_format_empty_item_2.f | 19 +++++++++++++++++++
gcc/testsuite/gfortran.dg/dec_format_empty_item_3.f | 19 +++++++++++++++++++
8 files changed, 88 insertions(+), 5 deletions(-)
create mode 100644 gcc/testsuite/gfortran.dg/dec_format_empty_item_1.f
create mode 100644 gcc/testsuite/gfortran.dg/dec_format_empty_item_2.f
create mode 100644 gcc/testsuite/gfortran.dg/dec_format_empty_item_3.f
diff --git a/gcc/fortran/gfortran.texi b/gcc/fortran/gfortran.texi
index 57461e0e42f..c887e7d1a42 100644
--- a/gcc/fortran/gfortran.texi
+++ b/gcc/fortran/gfortran.texi
@@ -1761,11 +1761,16 @@ When omitted, the count is implicitly assumed to be one.
To support legacy codes, GNU Fortran allows the comma separator
to be omitted immediately before and after character string edit
-descriptors in @code{FORMAT} statements.
+descriptors in @code{FORMAT} statements. A comma with no following format
+decriptor is permited if the @option{-fdec-blank-format-item} is given on
+the command line. This is considered non-conforming code and is
+discouraged.
@smallexample
PRINT 10, 2, 3
10 FORMAT ('FOO='I1' BAR='I2)
+ print 20, 5, 6
+20 FORMAT (I3, I3,)
@end smallexample
diff --git a/gcc/fortran/invoke.texi b/gcc/fortran/invoke.texi
index 2e2cb5b2728..2b08ac4de22 100644
--- a/gcc/fortran/invoke.texi
+++ b/gcc/fortran/invoke.texi
@@ -119,10 +119,10 @@ by type. Explanations are in the following sections.
@gccoptlist{-fall-intrinsics -fbackslash -fcray-pointer -fd-lines-as-code @gol
-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
+-fdec-blank-format-item -fdefault-double-8 -fdefault-integer-8 @gol
+-fdefault-real-8 -fdefault-real-10 -fdefault-real-16 -fdollar-ok @gol
+-ffixed-line-length-@var{n} -ffixed-line-length-none -fpad-source @gol
+-ffree-form -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
@@ -289,6 +289,11 @@ be on a single line and can use line continuations.
Enable format specifiers F, G and I to be used without width specifiers,
default widths will be used instead.
+@item -fdec-blank-format-item
+@opindex @code{fdec-blank-format-item}
+Enable a blank format item at the end of a format specification i.e. nothing
+following the final comma.
+
@item -fdollar-ok
@opindex @code{fdollar-ok}
@cindex @code{$}
diff --git a/gcc/fortran/io.c b/gcc/fortran/io.c
index 57117579627..9821c3c6c34 100644
--- a/gcc/fortran/io.c
+++ b/gcc/fortran/io.c
@@ -598,6 +598,7 @@ check_format (bool is_input)
{
const char *posint_required = _("Positive width required");
const char *nonneg_required = _("Nonnegative width required");
+ const char *missing_item = _("Missing item");
const char *unexpected_element = _("Unexpected element %qc in format "
"string at %L");
const char *unexpected_end = _("Unexpected end of format string");
@@ -756,6 +757,16 @@ format_item_1:
error = unexpected_end;
goto syntax;
+ case FMT_RPAREN:
+ /* Oracle allows a blank format item. */
+ if (flag_dec_blank_format_item)
+ goto finished;
+ else
+ {
+ error = missing_item;
+ goto syntax;
+ }
+
default:
error = unexpected_element;
goto syntax;
diff --git a/gcc/fortran/lang.opt b/gcc/fortran/lang.opt
index 93ea3d3977b..88674cb5dc7 100644
--- a/gcc/fortran/lang.opt
+++ b/gcc/fortran/lang.opt
@@ -444,6 +444,10 @@ fdec
Fortran Var(flag_dec)
Enable all DEC language extensions.
+fdec-blank-format-item
+Fortran Var(flag_dec_blank_format_item)
+Enable the use of blank format items in format strings.
+
fdec-include
Fortran Var(flag_dec_include)
Enable legacy parsing of INCLUDE as statement.
diff --git a/gcc/fortran/options.c b/gcc/fortran/options.c
index 4f91486e977..3bc79ef9b45 100644
--- a/gcc/fortran/options.c
+++ b/gcc/fortran/options.c
@@ -75,6 +75,7 @@ set_dec_flags (int value)
SET_BITFLAG (flag_dec_math, value, value);
SET_BITFLAG (flag_dec_include, value, value);
SET_BITFLAG (flag_dec_format_defaults, value, value);
+ SET_BITFLAG (flag_dec_blank_format_item, value, value);
}
/* Finalize DEC flags. */
diff --git a/gcc/testsuite/gfortran.dg/dec_format_empty_item_1.f b/gcc/testsuite/gfortran.dg/dec_format_empty_item_1.f
new file mode 100644
index 00000000000..ed27c18944b
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/dec_format_empty_item_1.f
@@ -0,0 +1,19 @@
+! { dg-do run }
+! { dg-options "-fdec" }
+!
+! Test blank/empty format items in format string
+!
+! Test case contributed by Jim MacArthur <jim.macart...@codethink.co.uk>
+! Modified by Mark Eggleston <mark.eggles...@codethink.com>
+!
+ PROGRAM blank_format_items
+ INTEGER A/0/
+
+ OPEN(1, status="scratch")
+ WRITE(1, 10) 100
+ REWIND(1)
+ READ(1, 10) A
+ IF (a.NE.100) STOP 1
+ PRINT 10, A
+10 FORMAT( I5,)
+ END
diff --git a/gcc/testsuite/gfortran.dg/dec_format_empty_item_2.f b/gcc/testsuite/gfortran.dg/dec_format_empty_item_2.f
new file mode 100644
index 00000000000..2793cb16225
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/dec_format_empty_item_2.f
@@ -0,0 +1,19 @@
+! { dg-do run }
+! { dg-options "-fdec-blank-format-item" }
+!
+! Test blank/empty format items in format string
+!
+! Test case contributed by Jim MacArthur <jim.macart...@codethink.co.uk>
+! Modified by Mark Eggleston <mark.eggles...@codethink.com>
+!
+ PROGRAM blank_format_items
+ INTEGER A/0/
+
+ OPEN(1, status="scratch")
+ WRITE(1, 10) 100
+ REWIND(1)
+ READ(1, 10) A
+ IF (a.NE.100) STOP 1
+ PRINT 10, A
+10 FORMAT( I5,)
+ END
diff --git a/gcc/testsuite/gfortran.dg/dec_format_empty_item_3.f b/gcc/testsuite/gfortran.dg/dec_format_empty_item_3.f
new file mode 100644
index 00000000000..dbccd671bae
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/dec_format_empty_item_3.f
@@ -0,0 +1,19 @@
+! { dg-do compile }
+! { dg-options "-fdec -fno-dec-blank-format-item" }
+!
+! Test blank/empty format items in format string
+!
+! Test case contributed by Jim MacArthur <jim.macart...@codethink.co.uk>
+! Modified by Mark Eggleston <mark.eggles...@codethink.com>
+!
+ PROGRAM blank_format_items
+ INTEGER A/0/
+
+ OPEN(1, status="scratch")
+ WRITE(1, 10) 100 ! { dg-error "FORMAT label 10 at" }
+ REWIND(1)
+ READ(1, 10) A ! { dg-error "FORMAT label 10 at" }
+ IF (a.NE.100) STOP 1
+ PRINT 10, A ! { dg-error "FORMAT label 10 at" }
+ 10 FORMAT( I5,) ! { dg-error "Missing item" }
+ END
--
2.11.0