This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: Fortran patches
- From: Steve Kargl <sgk at troutmask dot apl dot washington dot edu>
- To: Fritz Reese <fritzoreese at gmail dot com>
- Cc: fortran <fortran at gcc dot gnu dot org>, gcc-patches <gcc-patches at gcc dot gnu dot org>
- Date: Wed, 5 Dec 2018 16:03:15 -0800
- Subject: Re: Fortran patches
- References: <20181205045945.GA40221@troutmask.apl.washington.edu> <CAE4aFAm91Ri1fFVsRVh7gpE5WT-jsKe+_nsP+_ksRX2wcO=Zqw@mail.gmail.com>
- Reply-to: sgk at troutmask dot apl dot washington dot edu
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