diff options
author | Jerry DeLisle <jvdelisle@gcc.gnu.org> | 2007-11-28 01:02:36 +0000 |
---|---|---|
committer | Jerry DeLisle <jvdelisle@gcc.gnu.org> | 2007-11-28 01:02:36 +0000 |
commit | d46e0870c0206a50b032a5330760757b9afddc0b (patch) | |
tree | 360dafe071e3d22491016e8bc427f9a243e04222 | |
parent | f69ab0e0c412606b86a9989adcfec25f528c9f49 (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/fortran/decl.c | 24 |
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; } |