From 87c9fca50cbe7ca997fa4aaa70f5aa44d9e5db79 Mon Sep 17 00:00:00 2001 From: "Steven G. Kargl" Date: Sun, 23 Oct 2016 18:12:28 +0000 Subject: re PR fortran/54730 (ICE in gfc_typenode_for_spec, at fortran/trans-types.c:1066) 2016-10-23 Steven G. Kargl 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 PR fortran/54730 PR fortran/78033 * gfortran.dg/pr78033.f90: New test. From-SVN: r241451 --- gcc/fortran/array.c | 28 +++++++--------------------- 1 file changed, 7 insertions(+), 21 deletions(-) (limited to 'gcc/fortran/array.c') 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) { -- cgit v1.1