From: Janus Weil <janus@gcc.gnu.org>
To: "Dominique d'Humières" <dominiq@lps.ens.fr>
Cc: gfortran <fortran@gcc.gnu.org>,
gcc-patches <gcc-patches@gcc.gnu.org>,
Jerry DeLisle <jvdelisle@gcc.gnu.org>
Subject: Re: [Patch, Fortran] PR 78392: ICE in gfc_trans_auto_array_allocation, at fortran/trans-array.c:5979
Date: Sat, 19 Nov 2016 09:12:00 -0000 [thread overview]
Message-ID: <CAKwh3qjqYF3ozbX36hEpvjCVB0HrjbcbpadX7j_Zz8xb9GHDfg@mail.gmail.com> (raw)
In-Reply-To: <CAKwh3qj6PK8fvhrZYa45c_XGWG94nfX2qCyUBPz7QeLpme=F=A@mail.gmail.com>
[-- Attachment #1: Type: text/plain, Size: 1716 bytes --]
Hi all,
> I previously assumed that the test case for this PR would be legal,
> but by now I think that's wrong. The test case should be rejected, and
> we already have checking mechanisms for this (see
> resolve_fl_variable), but apparently they are not working.
>
> My current suspicion is that 'gfc_is_constant_expr' has a bug, because
> it claims the call to the function 'get_i' to be a constant
> expression. This is not true, because get_i() can not be reduced to a
> compile-time constant.
some more reading in the standard confirms this suspicion: In
gfc_is_constant_expr there is a piece of code which claims that
specification functions are constant. That is certainly not true, and
so what I'm doing in the attached fix is to remove that code and add
some references to the standard to make things clearer.
The code that I'm removing has last been touched in this commit by
Jerry six years ago:
https://gcc.gnu.org/viewcvs/gcc?view=revision&revision=166520
However, this did not introduce the bug in the first place (not sure
when that happened).
In any case the new patch in the attachment regtests cleanly and
correctly rejects the original test case as well as one of the cases
mentioned by Dominique. Ok for trunk?
Cheers,
Janus
2016-11-19 Janus Weil <janus@gcc.gnu.org>
PR fortran/78392
* expr.c (gfc_is_constant_expr): Specification functions are not
compile-time constants. Update documentation (add reference to F08
standard), add a FIXME.
(external_spec_function): Add reference to F08 standard.
* resolve.c (resolve_fl_variable): Ditto.
2016-11-19 Janus Weil <janus@gcc.gnu.org>
PR fortran/78392
* gfortran.dg/constant_shape.f90: New test case.
[-- Attachment #2: pr78392_v3.diff --]
[-- Type: text/plain, Size: 2537 bytes --]
Index: gcc/fortran/expr.c
===================================================================
--- gcc/fortran/expr.c (Revision 242620)
+++ gcc/fortran/expr.c (Arbeitskopie)
@@ -883,8 +883,9 @@ done:
}
-/* Function to determine if an expression is constant or not. This
- function expects that the expression has already been simplified. */
+/* Determine if an expression is constant in the sense of F08:7.1.12.
+ * This function expects that the expression has already been simplified.
+ * FIXME: Return a bool, not an int. */
int
gfc_is_constant_expr (gfc_expr *e)
@@ -891,7 +892,6 @@ gfc_is_constant_expr (gfc_expr *e)
{
gfc_constructor *c;
gfc_actual_arglist *arg;
- gfc_symbol *sym;
if (e == NULL)
return 1;
@@ -920,25 +920,6 @@ gfc_is_constant_expr (gfc_expr *e)
return 0;
}
- /* Specification functions are constant. */
- /* F95, 7.1.6.2; F2003, 7.1.7 */
- sym = NULL;
- if (e->symtree)
- sym = e->symtree->n.sym;
- if (e->value.function.esym)
- sym = e->value.function.esym;
-
- if (sym
- && sym->attr.function
- && sym->attr.pure
- && !sym->attr.intrinsic
- && !sym->attr.recursive
- && sym->attr.proc != PROC_INTERNAL
- && sym->attr.proc != PROC_ST_FUNCTION
- && sym->attr.proc != PROC_UNKNOWN
- && gfc_sym_get_dummy_args (sym) == NULL)
- return 1;
-
if (e->value.function.isym
&& (e->value.function.isym->elemental
|| e->value.function.isym->pure
@@ -2741,7 +2722,8 @@ restricted_args (gfc_actual_arglist *a)
/************* Restricted/specification expressions *************/
-/* Make sure a non-intrinsic function is a specification function. */
+/* Make sure a non-intrinsic function is a specification function,
+ * see F08:7.1.11.5. */
static bool
external_spec_function (gfc_expr *e)
Index: gcc/fortran/resolve.c
===================================================================
--- gcc/fortran/resolve.c (Revision 242620)
+++ gcc/fortran/resolve.c (Arbeitskopie)
@@ -11831,8 +11831,8 @@ resolve_fl_variable (gfc_symbol *sym, int mp_flag)
&& !sym->attr.pointer
&& is_non_constant_shape_array (sym))
{
- /* The shape of a main program or module array needs to be
- constant. */
+ /* F08:C541. The shape of an array defined in a main program or module
+ * needs to be constant. */
gfc_error ("The module or main program array %qs at %L must "
"have constant shape", sym->name, &sym->declared_at);
specification_expr = saved_specification_expr;
[-- Attachment #3: constant_shape.f90 --]
[-- Type: text/x-fortran, Size: 420 bytes --]
! { dg-do compile }
!
! PR 78392: ICE in gfc_trans_auto_array_allocation, at fortran/trans-array.c:5979
!
! Contributed by Janus Weil <janus@gcc.gnu.org>
module mytypes
implicit none
contains
pure integer function get_i ()
get_i = 13
end function
end module
program test
use mytypes
implicit none
integer, dimension(get_i()) :: x ! { dg-error "must have constant shape" }
print *, size (x)
end
next prev parent reply other threads:[~2016-11-19 9:12 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-11-18 14:05 Dominique d'Humières
2016-11-18 21:06 ` Janus Weil
2016-11-19 9:12 ` Janus Weil [this message]
2016-11-26 9:45 ` Janus Weil
2016-11-26 16:37 ` Dominique d'Humières
2016-11-26 18:10 ` Janus Weil
2016-12-03 7:05 ` Janus Weil
2016-12-12 15:52 ` Janus Weil
2016-12-12 17:37 ` Paul Richard Thomas
2016-12-12 18:56 ` Janus Weil
-- strict thread matches above, loose matches on Subject: below --
2016-11-18 13:03 Janus Weil
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=CAKwh3qjqYF3ozbX36hEpvjCVB0HrjbcbpadX7j_Zz8xb9GHDfg@mail.gmail.com \
--to=janus@gcc.gnu.org \
--cc=dominiq@lps.ens.fr \
--cc=fortran@gcc.gnu.org \
--cc=gcc-patches@gcc.gnu.org \
--cc=jvdelisle@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).