aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/array.c
diff options
context:
space:
mode:
authorSteven G. Kargl <kargl@gcc.gnu.org>2016-10-23 18:12:28 +0000
committerSteven G. Kargl <kargl@gcc.gnu.org>2016-10-23 18:12:28 +0000
commit87c9fca50cbe7ca997fa4aaa70f5aa44d9e5db79 (patch)
treed047cbbb70ee6dfd0c528751dfc9446fd5e07cb8 /gcc/fortran/array.c
parentdfd6231ea3621d57a2bf75f675fc8931ce5dec28 (diff)
downloadgcc-87c9fca50cbe7ca997fa4aaa70f5aa44d9e5db79.zip
gcc-87c9fca50cbe7ca997fa4aaa70f5aa44d9e5db79.tar.gz
gcc-87c9fca50cbe7ca997fa4aaa70f5aa44d9e5db79.tar.bz2
re PR fortran/54730 (ICE in gfc_typenode_for_spec, at fortran/trans-types.c:1066)
2016-10-23 Steven G. Kargl <kargl@gcc.gnu.org> PR fortran/54730 PR fortran/78033 * array.c (gfc_match_array_constructor): Remove checkpointing introduced in r196416 (original fix for PR fortran/54730). Move initialization to top of function. * match.c (gfc_match_type_spec): Special case matching for REAL. 2016-10-23 Steven G. Kargl <kargl@gcc.gnu.org> PR fortran/54730 PR fortran/78033 * gfortran.dg/pr78033.f90: New test. From-SVN: r241451
Diffstat (limited to 'gcc/fortran/array.c')
-rw-r--r--gcc/fortran/array.c28
1 files changed, 7 insertions, 21 deletions
diff --git a/gcc/fortran/array.c b/gcc/fortran/array.c
index 3e0218a..e6917a5 100644
--- a/gcc/fortran/array.c
+++ b/gcc/fortran/array.c
@@ -1091,7 +1091,6 @@ gfc_match_array_constructor (gfc_expr **result)
{
gfc_constructor *c;
gfc_constructor_base head;
- gfc_undo_change_set changed_syms;
gfc_expr *expr;
gfc_typespec ts;
locus where;
@@ -1099,6 +1098,9 @@ gfc_match_array_constructor (gfc_expr **result)
const char *end_delim;
bool seen_ts;
+ head = NULL;
+ seen_ts = false;
+
if (gfc_match (" (/") == MATCH_NO)
{
if (gfc_match (" [") == MATCH_NO)
@@ -1115,12 +1117,9 @@ gfc_match_array_constructor (gfc_expr **result)
end_delim = " /)";
where = gfc_current_locus;
- head = NULL;
- seen_ts = false;
/* Try to match an optional "type-spec ::" */
gfc_clear_ts (&ts);
- gfc_new_undo_checkpoint (changed_syms);
m = gfc_match_type_spec (&ts);
if (m == MATCH_YES)
{
@@ -1130,16 +1129,12 @@ gfc_match_array_constructor (gfc_expr **result)
{
if (!gfc_notify_std (GFC_STD_F2003, "Array constructor "
"including type specification at %C"))
- {
- gfc_restore_last_undo_checkpoint ();
- goto cleanup;
- }
+ goto cleanup;
if (ts.deferred)
{
gfc_error ("Type-spec at %L cannot contain a deferred "
"type parameter", &where);
- gfc_restore_last_undo_checkpoint ();
goto cleanup;
}
@@ -1148,24 +1143,15 @@ gfc_match_array_constructor (gfc_expr **result)
{
gfc_error ("Type-spec at %L cannot contain an asterisk for a "
"type parameter", &where);
- gfc_restore_last_undo_checkpoint ();
goto cleanup;
}
}
}
else if (m == MATCH_ERROR)
- {
- gfc_restore_last_undo_checkpoint ();
- goto cleanup;
- }
+ goto cleanup;
- if (seen_ts)
- gfc_drop_last_undo_checkpoint ();
- else
- {
- gfc_restore_last_undo_checkpoint ();
- gfc_current_locus = where;
- }
+ if (!seen_ts)
+ gfc_current_locus = where;
if (gfc_match (end_delim) == MATCH_YES)
{