From: Bernhard Reutner-Fischer <rep.dot.nop@gmail.com>
To: Harald Anlauf via Gcc-patches <gcc-patches@gcc.gnu.org>
Cc: rep.dot.nop@gmail.com, Harald Anlauf <anlauf@gmx.de>,
fortran <fortran@gcc.gnu.org>
Subject: Re: [PATCH] PR fortran/100950 - ICE in output_constructor_regular_field, at varasm.c:5514
Date: Thu, 10 Jun 2021 12:24:35 +0200 [thread overview]
Message-ID: <20210610122435.296a207d@nbbrfq> (raw)
In-Reply-To: <trinity-558ac6fa-645e-4b69-bd92-ed980a8db626-1623274785526@3c-app-gmx-bs42>
On Wed, 9 Jun 2021 23:39:45 +0200
Harald Anlauf via Gcc-patches <gcc-patches@gcc.gnu.org> wrote:
> diff --git a/gcc/fortran/simplify.c b/gcc/fortran/simplify.c
> index c27b47aa98f..016ec259518 100644
> --- a/gcc/fortran/simplify.c
> +++ b/gcc/fortran/simplify.c
> @@ -4512,6 +4512,60 @@ gfc_simplify_leadz (gfc_expr *e)
> }
>
>
> +/* Check for constant length of a substring. */
> +
> +static bool
> +substring_has_constant_len (gfc_expr *e)
> +{
> + ptrdiff_t istart, iend;
> + size_t length;
> + bool equal_length = false;
> +
> + if (e->ts.type != BT_CHARACTER
> + || !(e->ref && e->ref->type == REF_SUBSTRING)
iff we ever can get here with e->ref == NULL then the below will not
work too well. If so then maybe
if (e->ts.type != BT_CHARACTER
|| ! e->ref
|| e->ref->type != REF_SUBSTRING
?
> + || !e->ref->u.ss.start
> + || e->ref->u.ss.start->expr_type != EXPR_CONSTANT
> + || !e->ref->u.ss.end
> + || e->ref->u.ss.end->expr_type != EXPR_CONSTANT
> + || !e->ref->u.ss.length
> + || !e->ref->u.ss.length->length
> + || e->ref->u.ss.length->length->expr_type != EXPR_CONSTANT)
> + return false;
> +
> + /* Basic checks on substring starting and ending indices. */
> + if (!gfc_resolve_substring (e->ref, &equal_length))
> + return false;
> +
> + istart = gfc_mpz_get_hwi (e->ref->u.ss.start->value.integer);
> + iend = gfc_mpz_get_hwi (e->ref->u.ss.end->value.integer);
> + length = gfc_mpz_get_hwi (e->ref->u.ss.length->length->value.integer);
> +
> + if (istart <= iend)
> + {
> + if (istart < 1)
> + {
> + gfc_error ("Substring start index (%ld) at %L below 1",
> + (long) istart, &e->ref->u.ss.start->where);
> + return false;
> + }
> + if (iend > (ssize_t) length)
> + {
> + gfc_error ("Substring end index (%ld) at %L exceeds string "
> + "length", (long) iend, &e->ref->u.ss.end->where);
> + return false;
> + }
> + length = iend - istart + 1;
> + }
> + else
> + length = 0;
> +
> + /* Fix substring length. */
> + e->value.character.length = length;
> +
> + return true;
> +}
> +
> +
> gfc_expr *
> gfc_simplify_len (gfc_expr *e, gfc_expr *kind)
> {
> @@ -4547,6 +4601,13 @@ gfc_simplify_len (gfc_expr *e, gfc_expr *kind)
> of the unlimited polymorphic entity. To get the _len component the last
> _data ref needs to be stripped and a ref to the _len component added. */
> return gfc_get_len_component (e->symtree->n.sym->assoc->target, k);
> + else if (substring_has_constant_len (e))
> + {
> + result = gfc_get_constant_expr (BT_INTEGER, k, &e->where);
> + mpz_set_si (result->value.integer,
> + e->value.character.length);
I think the mpz_set_si args above fit on one line.
btw.. there's a commentary typo in add_init_expr_to_sym():
s/skeep/skip/
thanks,
> + return range_check (result, "LEN");
> + }
> else
> return NULL;
> }
> diff --git a/gcc/testsuite/gfortran.dg/pr100950.f90 b/gcc/testsuite/gfortran.dg/pr100950.f90
> new file mode 100644
> index 00000000000..f06db45b0b4
> --- /dev/null
> +++ b/gcc/testsuite/gfortran.dg/pr100950.f90
> @@ -0,0 +1,18 @@
> +! { dg-do run }
> +! PR fortran/100950 - ICE in output_constructor_regular_field, at varasm.c:5514
> +
> +program p
> + character(8), parameter :: u = "123"
> + character(8) :: x = "", s
> + character(2) :: w(2) = [character(len(x(3:4))) :: 'a','b' ]
> + character(*), parameter :: y(*) = [character(len(u(3:4))) :: 'a','b' ]
> + character(*), parameter :: z(*) = [character(len(x(3:4))) :: 'a','b' ]
> + if (len (y) /= 2) stop 1
> + if (len (z) /= 2) stop 2
> + if (any (w /= y)) stop 3
> + if (len ([character(len(u(3:4))) :: 'a','b' ]) /= 2) stop 4
> + if (len ([character(len(x(3:4))) :: 'a','b' ]) /= 2) stop 5
> + if (any ([character(len(x(3:4))) :: 'a','b' ] /= y)) stop 6
> + write(s,*) [character(len(x(3:4))) :: 'a','b' ]
> + if (s /= " a b ") stop 7
> +end
next prev parent reply other threads:[~2021-06-10 10:24 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-06-09 21:39 Harald Anlauf
2021-06-10 10:24 ` Bernhard Reutner-Fischer [this message]
2021-06-10 12:47 ` Bernhard Reutner-Fischer
2021-06-10 18:52 ` Harald Anlauf
2021-06-11 6:02 ` Bernhard Reutner-Fischer
2021-06-21 12:12 ` Tobias Burnus
2021-07-12 21:23 ` Harald Anlauf
2021-08-03 21:17 ` Harald Anlauf
2021-08-11 19:28 ` *PING* " Harald Anlauf
2021-08-18 10:22 ` Tobias Burnus
2021-08-18 21:01 ` Harald Anlauf
2021-08-19 7:52 ` Tobias Burnus
2021-08-19 19:11 ` Harald Anlauf
2021-08-20 0:21 ` H.J. Lu
2021-08-20 6:48 ` Harald Anlauf
2021-08-20 9:16 ` Jakub Jelinek
2021-08-20 9:45 ` Aw: " Harald Anlauf
2021-08-20 10:12 ` Jakub Jelinek
2021-08-20 10:53 ` Aw: " Harald Anlauf
2021-08-20 10:59 ` Jakub Jelinek
2021-08-20 11:43 ` [PATCH, committed] Fix bootstrap breakage caused by r12-3033 (PR fortran/100950 - ICE in output_constructor_regular_field, at varasm.c:5514) Harald Anlauf
2021-08-20 12:01 ` Aw: Re: Re: [PATCH] PR fortran/100950 - ICE in output_constructor_regular_field, at varasm.c:5514 Tobias Burnus
2021-08-20 12:17 ` Aw: " Harald Anlauf
2021-08-20 14:19 ` Tobias Burnus
2021-08-20 19:43 ` Harald Anlauf
2021-08-20 11:50 ` [Patch] c-format.c/Fortran: Support %wd / host-wide integer in gfc_error (Re: [PATCH] PR fortran/100950 - ICE in output_constructor_regular_field, at varasm.c:5514) Tobias Burnus
2021-08-20 11:56 ` Jakub Jelinek
2021-08-20 13:47 ` Tobias Burnus
2021-08-20 13:53 ` Jakub Jelinek
2021-08-20 9:29 ` [PATCH] PR fortran/100950 - ICE in output_constructor_regular_field, at varasm.c:5514 Tobias Burnus
2021-06-18 20:47 ` PING " Harald Anlauf
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210610122435.296a207d@nbbrfq \
--to=rep.dot.nop@gmail.com \
--cc=anlauf@gmx.de \
--cc=fortran@gcc.gnu.org \
--cc=gcc-patches@gcc.gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).