Commit a9f6f1f2 by Jerry DeLisle

re PR fortran/27954 (ICE on garbage in DATA statement)

2006-10-27  Jerry DeLisle  <jvdelisle@gcc.gnu.org>

	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
parent 95c0fb7a
2006-10-27 Jerry DeLisle <jvdelisle@gcc.gnu.org>
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 <eedelman@gcc.gnu.org> 2006-10-24 Erik Edelmann <eedelman@gcc.gnu.org>
PR fortran/29393 PR fortran/29393
......
...@@ -128,6 +128,21 @@ gfc_free_data (gfc_data * p) ...@@ -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 *); static match var_element (gfc_data_variable *);
/* Match a list of variables terminated by an iterator and a right /* Match a list of variables terminated by an iterator and a right
...@@ -262,6 +277,7 @@ top_var_list (gfc_data * d) ...@@ -262,6 +277,7 @@ top_var_list (gfc_data * d)
syntax: syntax:
gfc_syntax_error (ST_DATA); gfc_syntax_error (ST_DATA);
gfc_free_data_all (gfc_current_ns);
return MATCH_ERROR; return MATCH_ERROR;
} }
...@@ -374,6 +390,7 @@ top_val_list (gfc_data * data) ...@@ -374,6 +390,7 @@ top_val_list (gfc_data * data)
syntax: syntax:
gfc_syntax_error (ST_DATA); gfc_syntax_error (ST_DATA);
gfc_free_data_all (gfc_current_ns);
return MATCH_ERROR; return MATCH_ERROR;
} }
...@@ -2368,6 +2385,8 @@ ok: ...@@ -2368,6 +2385,8 @@ ok:
gfc_error ("Syntax error in data declaration at %C"); gfc_error ("Syntax error in data declaration at %C");
m = MATCH_ERROR; m = MATCH_ERROR;
gfc_free_data_all (gfc_current_ns);
cleanup: cleanup:
gfc_free_array_spec (current_as); gfc_free_array_spec (current_as);
current_as = NULL; current_as = NULL;
......
...@@ -193,7 +193,7 @@ gfc_typename (gfc_typespec * ts) ...@@ -193,7 +193,7 @@ gfc_typename (gfc_typespec * ts)
strcpy (buffer, "UNKNOWN"); strcpy (buffer, "UNKNOWN");
break; break;
default: default:
gfc_internal_error ("gfc_typespec(): Undefined type"); gfc_internal_error ("gfc_typename(): Undefined type");
} }
return buffer; return buffer;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment