This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Fortran patches


On Wed, Dec 05, 2018 at 04:48:28PM -0500, Fritz Reese wrote:
> On Wed, Dec 5, 2018 at 12:00 AM Steve Kargl
> <sgk@troutmask.apl.washington.edu> wrote:
> >
> > I intend to commit the attached patch on Saturday.
> 
> Thanks for the work. I assume the patch bootstraps and passes
> regression tests?

The patch passed regression testing on i586-*-freebsd.
I'll also do regression testing on x86_64-*-freebsd 
prior to the commit.

> RE:
> >         PR fortran/88228
> >         * expr.c (check_null, check_elemental): Work around -fdec and
> >         initialization with logical operators operating on integers.
> 
> I plan to review this section of the patch later today -- though the
> patch hides the segfault from the PR, I need more time to determine
> whether it is correct and complete.

By the time the gfc_expr is given to check_check and check_elemental,
it has been reduced to a EXPR_CONSTANT, which neither routine expected.
I simply return early in that case.

> RE:
> >        PR fortran/88139
> >        * dump-parse-tree.c (write_proc): Alternate return.
> I dissent with this patch. The introduced error is meaningless and, as
> mentioned by comment #3 in the PR, avoiding the ICE in dump-parse-tree
> is not directly the issue. The code should be rejected in parsing. In
> gcc-8.1 the invalid code is accepted (without an ICE) even without the
> -fc-prototypes flag: I haven't finished building the compiler with
> your changes yet to see whether that is still true afterwards, but at
> least the test case doesn't try this, so I strongly suspect the patch
> is incomplete to fix the PR.
 
Comment #3 does not contain a patch to fix the problem elsewhere.

In F2003, 15.2.6 "Interoperability of procedures and procedure interfaces",
I cannot find a prohibition on an alternate return in a subroutine
interface with BIND(C).

I'm disinclined to let a patch fester in bugzilla to only attain
the same fate as my patch to PR68544.

> RE:
> >        PR fortran/88205
> >        * io.c (gfc_match_open): STATUS must be CHARACTER type.
> [...]
> >@@ -2161,6 +2167,12 @@ gfc_match_open (void)
> >
> >       if (!open->file && open->status)
> >         {
> >+         if (open->status->ts.type != BT_CHARACTER)
> >+           {
> >+            gfc_error ("STATUS must be a default character type at %C");
> >+            goto cleanup;
> >+           }
> >+
> >          if (open->status->expr_type == EXPR_CONSTANT
> >             && gfc_wide_strncasecmp (open->status->value.character.string,
> >                                       "scratch", 7) != 0)
> 
> Both resolve_tag() and is_char_type() actually already catch type
> mismatches for STATUS (the latter for constant expressions). The real
> problem is the following condition which checks STATUS before it has
> been processed yet, since NEWUNIT is processed before STATUS. I think
> the correct thing to do is actually to move the NEWUNIT/UNIT if-block
> after the STATUS if-block, rather than adding a new phrasing for the
> same error.

OK. I'll check to see if this works.

> Then we should see:
> 
> pr88205.f90:13:29:
>    open (newunit=n, status=status)
>                              1
> Error: STATUS requires a scalar-default-char-expr at (1)
> 
> RE:
> >        PR fortran/88328
> >        * io.c (resolve_tag_format): Detect zero-sized array.
> [...]
> >Index: gcc/fortran/io.c
> >===================================================================
> >--- gcc/fortran/io.c    (revision 266718)
> >+++ gcc/fortran/io.c    (working copy)
> >@@ -1636,6 +1636,12 @@ resolve_tag_format (gfc_expr *e)
> >          gfc_expr *r;
> >          gfc_char_t *dest, *src;
> >
> >+         if (e->value.constructor == NULL)
> >+           {
> >+             gfc_error ("FORMAT tag at %C cannot be a zero-sized array");
> >+             return false;
> >+           }
> >+
> >          n = 0;
> >          c = gfc_constructor_first (e->value.constructor);
> >          len = c->expr->value.character.length;
> [...]
> >@ -3231,12 +3257,21 @@ gfc_resolve_dt (gfc_dt *dt, locus *loc)
> > {
> >   gfc_expr *e;
> >   io_kind k;
> >+  locus loc_tmp;
> >
> >   /* This is set in any case.  */
> >   gcc_assert (dt->dt_io_kind);
> >   k = dt->dt_io_kind->value.iokind;
> >
> >-  RESOLVE_TAG (&tag_format, dt->format_expr);
> >+  loc_tmp = gfc_current_locus;
> >+  gfc_current_locus = *loc;
> >+  if (!resolve_tag (&tag_format, dt->format_expr))
> >+    {
> >+      gfc_current_locus = loc_tmp;
> >+      return false;
> >+    }
> >+  gfc_current_locus = loc_tmp;
> >+
> >   RESOLVE_TAG (&tag_rec, dt->rec);
> >   RESOLVE_TAG (&tag_spos, dt->pos);
> >   RESOLVE_TAG (&tag_advance, dt->advance);
> 
> Is it really true that resolve_tag_format needs the locus at
> gfc_resolve_dt::loc instead of e->where as with the other errors in
> resolve_tag_format? If so, are the other errors also incorrect in
> using e->where? Might it then be better to pass loc from
> gfc_resolve_dt down to resolve_tag/RESOLVE_TAG and then
> resolve_tag_format, instead of swapping gfc_current_locus?

program p
   character(3), parameter :: a(0) = [character(3)::]
   print a
end

With the patch using loc I get

a.f90:3:10:

    3 |    print a
      |          1
Error: FORMAT tag at (1) cannot be a zero-sized array

If I used e->where one gets

a.f90:2:32:

    2 |    character(3), parameter :: a(0) = [character(3)::] 
      |                               1
Error: FORMAT tag at (1) cannot be a zero-sized array

Now, imagine a few hundred lines separating the two statements.
I think the latter error locus is preferable.

I did not audit the other uses of e->where to see where the
locus ends up pointing if those errors are triggered.

> RE:
> >        PR fortran/88048
> >        * resolve.c (check_data_variable): Convert gfc_internal_error to
> >        an gfc_error.  Add a nearby missing 'return false;'
> [...]
> >        PR fortran/88025
> >        * expr.c (gfc_apply_init): Remove asserts and check for valid
> >        ts->u.cl->length.
> [...]
> >        PR fortran/88116
> >        * simplify.c: Remove internal error and return gfc_bad_expr.
> 
> These look good.
> 
> A few pedantic comments:
> 

I'll address these before the commit.

-- 
Steve


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]