This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] PR fortran/59910 -- structure constructor in DATA statement
- From: Steve Kargl <sgk at troutmask dot apl dot washington dot edu>
- To: fortran at gcc dot gnu dot org, gcc-patches at gcc dot gnu dot org
- Date: Tue, 17 Nov 2015 12:34:42 -0800
- Subject: [PATCH] PR fortran/59910 -- structure constructor in DATA statement
- Authentication-results: sourceware.org; auth=none
Here's what looks like a fairly simple patch, but it leads
to a question. Why does gfortran not try to reduce the
components in a structure constructor in general? I've
hidden the gfc_reduce_init_expr() behind a check for a
DATA statement, but I suspect gfc_reduce_init_expr()
may be useful for PARAMETER statements as well (need to
check this!).
Anyway, the patch has been built and tested on x86_64-*-freebsd.
A slightly different patch was built and tested on i386-*-freebsd.
OK to commit?
2015-11-17 Steven G. Kargl <kargl@gcc.gnu.org>
PR fortran/59910
* primary.c (gfc_match_structure_constructor): Reduce a structure
constructor in a DATA statement.
2015-11-17 Steven G. Kargl <kargl@gcc.gnu.org>
PR fortran/59910
* gfortran.dg/pr59910.f90:
--
Steve
Index: gcc/fortran/primary.c
===================================================================
--- gcc/fortran/primary.c (revision 230497)
+++ gcc/fortran/primary.c (working copy)
@@ -2722,6 +2722,12 @@ gfc_match_structure_constructor (gfc_sym
return MATCH_ERROR;
}
+ /* If a structure constructor is in a DATA statement, then each entity
+ in the structure constructor must be a constant. Try to reduce the
+ expression here. */
+ if (gfc_in_match_data ())
+ gfc_reduce_init_expr (e);
+
*result = e;
return MATCH_YES;
}
Index: gcc/testsuite/gfortran.dg/pr59910.f90
===================================================================
--- gcc/testsuite/gfortran.dg/pr59910.f90 (nonexistent)
+++ gcc/testsuite/gfortran.dg/pr59910.f90 (working copy)
@@ -0,0 +1,11 @@
+! { dg-do compile }
+! PR fortran/59910
+!
+program main
+ implicit none
+ type bar
+ integer :: limit(1)
+ end type
+ type (bar) :: testsuite
+ data testsuite / bar(reshape(source=[10],shape=[1])) /
+end