public inbox for fortran@gcc.gnu.org
 help / color / mirror / Atom feed
From: Tobias Burnus <tobias@codesourcery.com>
To: Harald Anlauf <anlauf@gmx.de>, fortran <fortran@gcc.gnu.org>,
	gcc-patches <gcc-patches@gcc.gnu.org>
Subject: Re: [PATCH] PR fortran/99205 - [10/11 Regression] Out of memory with undefined character length
Date: Wed, 10 Mar 2021 11:06:16 +0100	[thread overview]
Message-ID: <8a63eb89-91e6-1e8d-870e-8a2f7a6750df@codesourcery.com> (raw)
In-Reply-To: <trinity-f0b06340-8653-42d5-b5bf-fcfb5e2ce01e-1615319100120@3c-app-gmx-bs50>

Dear Harald, dear all,

On 09.03.21 20:45, Harald Anlauf via Fortran wrote:
> character variables with undefined length are not allowed as
> objects in DATA statements.  We better reject them.
>
> Regtested on x86_64-pc-linux-gnu.  OK for master / backport?
>
> PR fortran/99205 - Out of memory with undefined character length
>
> A variable that is a data statement object shall be a designator,
> thus a character variable shall have a constant length.

This comment is wrong: A designator does not imply this – nor is
F2018:C875 violated, not even the substring starting/ending point
const expr bit.


The reason that it is not permitted is the "automatic data object"
(see *...* highlighted parts in the quote):

C876   (R839) A *variable* whose *designator* appears as a
*data-stmt-object* or a data-i-do-object hall not be a
dummy argument, accessed by use or host association,
in a named common block unless the DATA statement is
in a block data program unit, in blank common, a function name,
a function result name, an *automatic* *data* *object,*
or an allocatable variable.

With the definition: "3.11 automatic data object
nondummy data object with a type parameter or array bound that
depends on the value of aspecification-expr that is not
a constant expression (8.3)"


In the following variant of the program, the invalid
variable declaration of 'c' itself is avoided by using
a block:

integer :: ll
ll = 4
block
   character(ll) :: c(2), cc(2)
   character(ll) :: c2(2), cc2(2)
   data c /'a', 'b'/
   data c2(:)(1:1) /'a', 'b'/
   common /block/ cc, cc2
end block
end

You may consider to update your testcase or to
augment your testcase.

The patch itself is OK, but you really need to
update the commit description.

Tobias

>
> gcc/fortran/ChangeLog:
>
>       PR fortran/99205
>       * data.c (gfc_assign_data_value): Reject non-constant character
>       length for lvalue.
>
> gcc/testsuite/ChangeLog:
>
>       PR fortran/99205
>       * gfortran.dg/pr99205.f90: New test.
>
>
> pr99205.patch
>
> diff --git a/gcc/fortran/data.c b/gcc/fortran/data.c
> index 25e97930169..71e2552025d 100644
> --- a/gcc/fortran/data.c
> +++ b/gcc/fortran/data.c
> @@ -595,6 +595,9 @@ gfc_assign_data_value (gfc_expr *lvalue, gfc_expr *rvalue, mpz_t index,
>         /* An initializer has to be constant.  */
>         if (lvalue->ts.u.cl->length == NULL && !(ref && ref->u.ss.length != NULL))
>       return false;
> +      if (lvalue->ts.u.cl->length
> +       && lvalue->ts.u.cl->length->expr_type != EXPR_CONSTANT)
> +     return false;
>         expr = create_character_initializer (init, last_ts, ref, rvalue);
>         if (!expr)
>       return false;
> diff --git a/gcc/testsuite/gfortran.dg/pr99205.f90 b/gcc/testsuite/gfortran.dg/pr99205.f90
> new file mode 100644
> index 00000000000..ed0782ce8a0
> --- /dev/null
> +++ b/gcc/testsuite/gfortran.dg/pr99205.f90
> @@ -0,0 +1,11 @@
> +! { dg-do compile }
> +! PR fortran/99205 - Out of memory with undefined character length
> +! { dg-options "-w" }
> +
> +program p
> +  character(l) :: c(2) ! { dg-error "must have constant character length" }
> +  data c /'a', 'b'/
> +  common c
> +end
> +
> +! { dg-error "cannot appear in the expression at" " " { target *-*-* } 6 }
-----------------
Mentor Graphics (Deutschland) GmbH, Arnulfstrasse 201, 80634 München Registergericht München HRB 106955, Geschäftsführer: Thomas Heurung, Frank Thürauf

  reply	other threads:[~2021-03-10 10:06 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-03-09 19:45 Harald Anlauf
2021-03-10 10:06 ` Tobias Burnus [this message]
2021-03-10 19:43   ` Harald Anlauf
2021-03-10 20:18     ` Tobias Burnus
2021-03-10 21:26   ` Harald Anlauf
2021-03-10 21:52     ` Tobias Burnus

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=8a63eb89-91e6-1e8d-870e-8a2f7a6750df@codesourcery.com \
    --to=tobias@codesourcery.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).