From a9f6f1f27fd181ed18eab6a61a055ba8a55817b0 Mon Sep 17 00:00:00 2001 From: Jerry DeLisle Date: Fri, 27 Oct 2006 20:47:28 +0000 Subject: re PR fortran/27954 (ICE on garbage in DATA statement) 2006-10-27 Jerry DeLisle PR fortran/27954 * decl.c (gfc_free_data_all): New function to free all data structures after errors in DATA statements and declarations. (top_var_list): Use new function.(top_val_list): Use new function. (gfc_match_data_decl): Use new function. * misc.c (gfc_typename): Fixed incorrect function name in error text. From-SVN: r118084 --- gcc/fortran/ChangeLog | 9 +++++++++ gcc/fortran/decl.c | 19 +++++++++++++++++++ gcc/fortran/misc.c | 2 +- 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 0d29f46..8ff4a5f 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,12 @@ +2006-10-27 Jerry DeLisle + + PR fortran/27954 + * decl.c (gfc_free_data_all): New function to free all data structures + after errors in DATA statements and declarations. + (top_var_list): Use new function.(top_val_list): Use new function. + (gfc_match_data_decl): Use new function. + * misc.c (gfc_typename): Fixed incorrect function name in error text. + 2006-10-24 Erik Edelmann PR fortran/29393 diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c index 02dc38c..fbd2bbb 100644 --- a/gcc/fortran/decl.c +++ b/gcc/fortran/decl.c @@ -128,6 +128,21 @@ gfc_free_data (gfc_data * p) } +/* Free all data in a namespace. */ +static void +gfc_free_data_all (gfc_namespace * ns) +{ + gfc_data *d; + + for (;ns->data;) + { + d = ns->data->next; + gfc_free (ns->data); + ns->data = d; + } +} + + static match var_element (gfc_data_variable *); /* Match a list of variables terminated by an iterator and a right @@ -262,6 +277,7 @@ top_var_list (gfc_data * d) syntax: gfc_syntax_error (ST_DATA); + gfc_free_data_all (gfc_current_ns); return MATCH_ERROR; } @@ -374,6 +390,7 @@ top_val_list (gfc_data * data) syntax: gfc_syntax_error (ST_DATA); + gfc_free_data_all (gfc_current_ns); return MATCH_ERROR; } @@ -2368,6 +2385,8 @@ ok: gfc_error ("Syntax error in data declaration at %C"); m = MATCH_ERROR; + gfc_free_data_all (gfc_current_ns); + cleanup: gfc_free_array_spec (current_as); current_as = NULL; diff --git a/gcc/fortran/misc.c b/gcc/fortran/misc.c index 4d94d7f..bafb698 100644 --- a/gcc/fortran/misc.c +++ b/gcc/fortran/misc.c @@ -193,7 +193,7 @@ gfc_typename (gfc_typespec * ts) strcpy (buffer, "UNKNOWN"); break; default: - gfc_internal_error ("gfc_typespec(): Undefined type"); + gfc_internal_error ("gfc_typename(): Undefined type"); } return buffer; -- cgit v1.1