Commit c0184444 by H.J. Lu Committed by H.J. Lu

re PR fortran/33375 (ICE (segfault) gfortran.dg/common_6.f90)

2008-01-17  H.J. Lu  <hongjiu.lu@intel.com>

	PR fortran/33375
	* symbol.c (free_common_tree): Renamed to ...
	(gfc_free_common_tree): This.  Remove static.
	(gfc_free_namespace): Updated.

	* gfortran.h (gfc_free_common_tree): New.

	* match.c (gfc_match_common): Call gfc_free_common_tree () with
	gfc_current_ns->common_root and set gfc_current_ns->common_root
	to NULL on syntax error.

From-SVN: r131621
parent 5cc5439e
2008-01-17 H.J. Lu <hongjiu.lu@intel.com>
PR fortran/33375
* symbol.c (free_common_tree): Renamed to ...
(gfc_free_common_tree): This. Remove static.
(gfc_free_namespace): Updated.
* gfortran.h (gfc_free_common_tree): New.
* match.c (gfc_match_common): Call gfc_free_common_tree () with
gfc_current_ns->common_root and set gfc_current_ns->common_root
to NULL on syntax error.
2008-01-18 Richard Sandiford <rsandifo@nildram.co.uk> 2008-01-18 Richard Sandiford <rsandifo@nildram.co.uk>
PR fortran/34686 PR fortran/34686
......
...@@ -2137,6 +2137,7 @@ int gfc_symbols_could_alias (gfc_symbol *, gfc_symbol *); ...@@ -2137,6 +2137,7 @@ int gfc_symbols_could_alias (gfc_symbol *, gfc_symbol *);
void gfc_undo_symbols (void); void gfc_undo_symbols (void);
void gfc_commit_symbols (void); void gfc_commit_symbols (void);
void gfc_commit_symbol (gfc_symbol *); void gfc_commit_symbol (gfc_symbol *);
void gfc_free_common_tree (gfc_symtree *);
void gfc_free_namespace (gfc_namespace *); void gfc_free_namespace (gfc_namespace *);
void gfc_symbol_init_2 (void); void gfc_symbol_init_2 (void);
......
...@@ -2951,6 +2951,8 @@ done: ...@@ -2951,6 +2951,8 @@ done:
return MATCH_YES; return MATCH_YES;
syntax: syntax:
gfc_free_common_tree (gfc_current_ns->common_root);
gfc_current_ns->common_root = NULL;
gfc_syntax_error (ST_COMMON); gfc_syntax_error (ST_COMMON);
cleanup: cleanup:
......
...@@ -2726,14 +2726,14 @@ gfc_commit_symbol (gfc_symbol *sym) ...@@ -2726,14 +2726,14 @@ gfc_commit_symbol (gfc_symbol *sym)
/* Recursive function that deletes an entire tree and all the common /* Recursive function that deletes an entire tree and all the common
head structures it points to. */ head structures it points to. */
static void void
free_common_tree (gfc_symtree * common_tree) gfc_free_common_tree (gfc_symtree * common_tree)
{ {
if (common_tree == NULL) if (common_tree == NULL)
return; return;
free_common_tree (common_tree->left); gfc_free_common_tree (common_tree->left);
free_common_tree (common_tree->right); gfc_free_common_tree (common_tree->right);
gfc_free (common_tree); gfc_free (common_tree);
} }
...@@ -2863,7 +2863,7 @@ gfc_free_namespace (gfc_namespace *ns) ...@@ -2863,7 +2863,7 @@ gfc_free_namespace (gfc_namespace *ns)
free_sym_tree (ns->sym_root); free_sym_tree (ns->sym_root);
free_uop_tree (ns->uop_root); free_uop_tree (ns->uop_root);
free_common_tree (ns->common_root); gfc_free_common_tree (ns->common_root);
for (cl = ns->cl_list; cl; cl = cl2) for (cl = ns->cl_list; cl; cl = cl2)
{ {
......
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