diff mbox series

PR fortran/89103 - Allow blank format items in format strings

Message ID 48e1b516-f5ff-f437-c734-f8e6633dd467@codethink.co.uk
State New
Headers show
Series PR fortran/89103 - Allow blank format items in format strings | expand

Commit Message

Mark Eggleston May 23, 2019, 8:19 a.m. UTC
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89103 see comment 4

Please can some one commit the attached patch for me as I do not have 
the privileges to do so.

Change logs:

gcc/fortran

     Jim MacArthur  <jim.macarthur@codethink.co.uk>
     Mark Eggleston  <mark.eggleston@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): At FMT_RPAREN goto finished if
     -fdec-blank-format-item.
     * lang.opt: Add new option.
     * options.c (set_dec_flags): Add SET_BITFLAG for
     flag_dec_format_defaults.

gcc/testsuite

     Jim MacArthur <jim.macarthur@codethink.co.uk>
     Mark Eggleston <mark.eggleston@codethink.com>

     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.

Comments

Mark Eggleston June 11, 2019, 9:30 a.m. UTC | #1
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.macarthur@codethink.co.uk>
     Mark Eggleston  <mark.eggleston@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.macarthur@codethink.co.uk>
     Mark Eggleston <mark.eggleston@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
>>
Jakub Jelinek June 11, 2019, 9:50 a.m. UTC | #2
On Tue, Jun 11, 2019 at 10:30:59AM +0100, Mark Eggleston wrote:
>     Jim MacArthur <jim.macarthur@codethink.co.uk>
>     Mark Eggleston <mark.eggleston@codethink.com>

Two spaces before < instead of one.

This is not a patch review, just comments:

> 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.

That is not true, one can fall through just fine, just there needs to be a
comment or attribute or builtin that says so.

> --- 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;
> +	}

So, if you want to fall thru, just do:
    case FMT_RPAREN:
      if (flag_dec_blank_format_item)
	goto finished;
      /* FALLTHRU */

> +
>      default:
>        error = unexpected_element;
>        goto syntax;

and that is it.  Not sure I'd mention the Oracle fortran compiler there,
either it is common to other DEC based compilers too (DEC fortran, ifort,
...) and then the comment makes no sense, or it might not be best to call
the flag -fdec-whatever.

Furthermore, even if you want to have a _("Missing item"), you should write
it as error = _("Missing item");, not the way it is written, as that way it
is inefficient at compile time.

The rest is just a general comment on the preexisting code.
Using a bunch of const char *whatever = _("...");
at the start of function is undesirable, it means any time this function is
called, even in the likely case there is no error, all those strings need to
be translated.  It would be better to e.g. replace all _("...") in that
function with G_("...") (i.e. mark for translation, but don't translate),
and only when actually using that translate:
  if (error == unexpected_element)
    gfc_error (error, error_element, &format_locus);
  else
    gfc_error ("%s in format string at %L", error, &format_locus);
The first case is translated already by gfc_error, the second one would need
_(error) instead of error (but is generally wrong anyway, because you are
constructing a diagnostics from two pieces which might not be ok for
translations.  So, likely you want to append " in format string at %L" to
all the error string literals inside of G_("...") and just pass error as
first argument to gfc_error.

	Jakub
Steve Kargl June 12, 2019, 6:11 p.m. UTC | #3
On Tue, Jun 11, 2019 at 11:50:40AM +0200, Jakub Jelinek wrote:
> On Tue, Jun 11, 2019 at 10:30:59AM +0100, Mark Eggleston wrote:
> >     Jim MacArthur <jim.macarthur@codethink.co.uk>
> >     Mark Eggleston <mark.eggleston@codethink.com>
> 
> Two spaces before < instead of one.
> 
> This is not a patch review, just comments:

Mark, do you plan to address any of Jakub's comments.
Do note, I just 'OK' Jakub's patch that uses G_()
forms for the strings.

Also, do you have plans to contribute additional
patches (either for -fdec* extensions or preferrably
to help with bug fixes and new features)?  It may be
advantageous for you to get a commit bit.
Mark Eggleston June 17, 2019, 1:37 p.m. UTC | #4
On 12/06/2019 19:11, Steve Kargl wrote:
> On Tue, Jun 11, 2019 at 11:50:40AM +0200, Jakub Jelinek wrote:
>> On Tue, Jun 11, 2019 at 10:30:59AM +0100, Mark Eggleston wrote:
>>>      Jim MacArthur <jim.macarthur@codethink.co.uk>
>>>      Mark Eggleston <mark.eggleston@codethink.com>
>> Two spaces before < instead of one.
>>
>> This is not a patch review, just comments:
> Mark, do you plan to address any of Jakub's comments.
> Do note, I just 'OK' Jakub's patch that uses G_()
> forms for the strings.

Now that Jakubs's patch has been committed, please find attached an 
updated patch and updated change logs:

gcc/fortran

     Jim MacArthur  <jim.macarthur@codethink.co.uk>
     Mark Eggleston  <mark.eggleston@codethink.com>

     PR fortran/89103
     * gfortran.texi: Add -fdec-blank-format-item
     * invoke.texi: Add option to list of options.
     * invoke.texi: Add to section on Commas in FORMAT specifications.
     * io.c (check_format): At FMT_RPAREN goto finished if
     -fdec-blank-format-item otherwise set error string.
     * lang.opt: Add new option.
     * options.c (set_dec_flags): Add SET_BITFLAG for
     flag_dec_format_defaults.

gcc/testsuite

     Jim MacArthur  <jim.macarthur@codethink.co.uk>
     Mark Eggleston  <mark.eggleston@codethink.com>

     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.

as before... Please can someone commit this as do not have commit rights.

>
> Also, do you have plans to contribute additional
> patches (either for -fdec* extensions or preferrably
> to help with bug fixes and new features)?  It may be
> advantageous for you to get a commit bit.
Yes, I do intend to contribute additional patches, mostly -fdec- 
patches, there are also some patches unrelated to -fdec* extensions.
Jerry DeLisle June 19, 2019, 1:39 a.m. UTC | #5
I will see if I can get this one.

On 6/17/19 6:37 AM, Mark Eggleston wrote:
> 
> On 12/06/2019 19:11, Steve Kargl wrote:
>> On Tue, Jun 11, 2019 at 11:50:40AM +0200, Jakub Jelinek wrote:
>>> On Tue, Jun 11, 2019 at 10:30:59AM +0100, Mark Eggleston wrote:
>>>>      Jim MacArthur <jim.macarthur@codethink.co.uk>
>>>>      Mark Eggleston <mark.eggleston@codethink.com>
>>> Two spaces before < instead of one.
>>>
>>> This is not a patch review, just comments:
>> Mark, do you plan to address any of Jakub's comments.
>> Do note, I just 'OK' Jakub's patch that uses G_()
>> forms for the strings.
> 
> Now that Jakubs's patch has been committed, please find attached an updated 
> patch and updated change logs:
> 
> gcc/fortran
> 
>      Jim MacArthur  <jim.macarthur@codethink.co.uk>
>      Mark Eggleston  <mark.eggleston@codethink.com>
> 
>      PR fortran/89103
>      * gfortran.texi: Add -fdec-blank-format-item
>      * invoke.texi: Add option to list of options.
>      * invoke.texi: Add to section on Commas in FORMAT specifications.
>      * io.c (check_format): At FMT_RPAREN goto finished if
>      -fdec-blank-format-item otherwise set error string.
>      * lang.opt: Add new option.
>      * options.c (set_dec_flags): Add SET_BITFLAG for
>      flag_dec_format_defaults.
> 
> gcc/testsuite
> 
>      Jim MacArthur  <jim.macarthur@codethink.co.uk>
>      Mark Eggleston  <mark.eggleston@codethink.com>
> 
>      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.
> 
> as before... Please can someone commit this as do not have commit rights.
> 
>>
>> Also, do you have plans to contribute additional
>> patches (either for -fdec* extensions or preferrably
>> to help with bug fixes and new features)?  It may be
>> advantageous for you to get a commit bit.
> Yes, I do intend to contribute additional patches, mostly -fdec- patches, there 
> are also some patches unrelated to -fdec* extensions.
> 
>
diff mbox series

Patch

From f04143dd423d2eda2ce206e42ae914374b273f82 Mon Sep 17 00:00:00 2001
From: Jim MacArthur <jim.macarthur@codethink.co.uk>
Date: Thu, 4 Feb 2016 16:59:41 +0000
Subject: [PATCH 1/5] 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.marchena@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                                    | 10 ++++++++++
 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, 87 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 0e6c57142cd..2d53202dd71 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 63fce66a593..80804993522 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
@@ -288,6 +288,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 80a0d7402d2..4d0de65be1a 100644
--- a/gcc/fortran/io.c
+++ b/gcc/fortran/io.c
@@ -756,6 +756,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 = unexpected_element;
+	  goto syntax;
+	}
+
     default:
       error = unexpected_element;
       goto syntax;
diff --git a/gcc/fortran/lang.opt b/gcc/fortran/lang.opt
index 26e82601b62..cc2eae238b9 100644
--- a/gcc/fortran/lang.opt
+++ b/gcc/fortran/lang.opt
@@ -440,6 +440,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 9ba48dc8439..e32aa441822 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.macarthur@codethink.co.uk>
+! Modified by Mark Eggleston <mark.eggleston@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.macarthur@codethink.co.uk>
+! Modified by Mark Eggleston <mark.eggleston@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..499db922876
--- /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.macarthur@codethink.co.uk>
+! Modified by Mark Eggleston <mark.eggleston@codethink.com>
+!
+        PROGRAM blank_format_items
+          INTEGER A/0/
+
+          OPEN(1, status="scratch")
+          WRITE(1, 10) 100 ! { dg-error "FORMAT label 10 at \\(1\\) not defined" }
+          REWIND(1)
+          READ(1, 10) A ! { dg-error "FORMAT label 10 at \\(1\\) not defined" }
+          IF (a.NE.100) STOP 1
+          PRINT 10, A ! { dg-error "FORMAT label 10 at \\(1\\) not defined" }
+10        FORMAT( I5,) ! { dg-error "Unexpected element" }
+        END
-- 
2.11.0