aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJerry DeLisle <jvdelisle@gcc.gnu.org>2007-11-28 01:02:36 +0000
committerJerry DeLisle <jvdelisle@gcc.gnu.org>2007-11-28 01:02:36 +0000
commitd46e0870c0206a50b032a5330760757b9afddc0b (patch)
tree360dafe071e3d22491016e8bc427f9a243e04222
parentf69ab0e0c412606b86a9989adcfec25f528c9f49 (diff)
downloadgcc-d46e0870c0206a50b032a5330760757b9afddc0b.zip
gcc-d46e0870c0206a50b032a5330760757b9afddc0b.tar.gz
gcc-d46e0870c0206a50b032a5330760757b9afddc0b.tar.bz2
re PR fortran/32928 (DATA statement with array element as initializer is rejected)
2007-11-27 Jerry DeLisle <jvdelisle@gcc.gnu.org> PR fortran/32928 * decl.c (match_data_constant): Use gfc_match_init_expr to match the array spec and set the initializer expression. From-SVN: r130484
-rw-r--r--gcc/fortran/ChangeLog6
-rw-r--r--gcc/fortran/decl.c24
2 files changed, 30 insertions, 0 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index fcb03bc..19eba46 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,5 +1,11 @@
2007-11-27 Jerry DeLisle <jvdelisle@gcc.gnu.org>
+ PR fortran/32928
+ * decl.c (match_data_constant): Use gfc_match_init_expr to match the
+ array spec and set the initializer expression.
+
+2007-11-27 Jerry DeLisle <jvdelisle@gcc.gnu.org>
+
PR fortran/34227
* match.c (gfc_match_common): Add additional check for BLOCK DATA.
diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c
index a35071b..0da9cd2 100644
--- a/gcc/fortran/decl.c
+++ b/gcc/fortran/decl.c
@@ -370,6 +370,30 @@ match_data_constant (gfc_expr **result)
else if (sym->attr.flavor == FL_DERIVED)
return gfc_match_structure_constructor (sym, result);
+ /* Check to see if the value is an initialization array expression. */
+ if (sym->value->expr_type == EXPR_ARRAY)
+ {
+ gfc_current_locus = old_loc;
+
+ m = gfc_match_init_expr (result);
+ if (m == MATCH_ERROR)
+ return m;
+
+ if (m == MATCH_YES)
+ {
+ if (gfc_simplify_expr (*result, 0) == FAILURE)
+ m = MATCH_ERROR;
+
+ if ((*result)->expr_type == EXPR_CONSTANT)
+ return m;
+ else
+ {
+ gfc_error ("Invalid initializer %s in Data statement at %C", name);
+ return MATCH_ERROR;
+ }
+ }
+ }
+
*result = gfc_copy_expr (sym->value);
return MATCH_YES;
}