Commit 31fee91e by Mikael Morin

re PR fortran/44660 (ICE in resolve_equivalence())

2010-07-25  Mikael Morin  <mikael@gcc.gnu.org>

	PR fortran/44660
	* gfortran.h (gfc_namespace): New field old_equiv.
	(gfc_free_equiv_until): New prototype.
	* match.c (gfc_free_equiv_until): New, renamed from gfc_free_equiv with
	a parameterized stop condition.
	(gfc_free_equiv): Use gfc_free_equiv_until.
	* parse.c (next_statement): Save equivalence list.
	(reject_statement): Restore equivalence list.

From-SVN: r162516
parent 20b84bef
...@@ -78,6 +78,17 @@ ...@@ -78,6 +78,17 @@
* dependency.c (gfc_check_dependency): Add argument alising check. * dependency.c (gfc_check_dependency): Add argument alising check.
* symbol.c (gfc_symbols_could_alias): Add argument alising check. * symbol.c (gfc_symbols_could_alias): Add argument alising check.
2010-07-25 Mikael Morin <mikael@gcc.gnu.org>
PR fortran/44660
* gfortran.h (gfc_namespace): New field old_equiv.
(gfc_free_equiv_until): New prototype.
* match.c (gfc_free_equiv_until): New, renamed from gfc_free_equiv with
a parameterized stop condition.
(gfc_free_equiv): Use gfc_free_equiv_until.
* parse.c (next_statement): Save equivalence list.
(reject_statement): Restore equivalence list.
2010-07-22 Daniel Kraft <d@domob.eu> 2010-07-22 Daniel Kraft <d@domob.eu>
* trans-stmt.c (gfc_trans_return): Put back in the handling of se.post, * trans-stmt.c (gfc_trans_return): Put back in the handling of se.post,
......
...@@ -1355,7 +1355,7 @@ typedef struct gfc_namespace ...@@ -1355,7 +1355,7 @@ typedef struct gfc_namespace
struct gfc_code *code; struct gfc_code *code;
/* Points to the equivalences set up in this namespace. */ /* Points to the equivalences set up in this namespace. */
struct gfc_equiv *equiv; struct gfc_equiv *equiv, *old_equiv;
/* Points to the equivalence groups produced by trans_common. */ /* Points to the equivalence groups produced by trans_common. */
struct gfc_equiv_list *equiv_lists; struct gfc_equiv_list *equiv_lists;
...@@ -2611,6 +2611,7 @@ void gfc_free_forall_iterator (gfc_forall_iterator *); ...@@ -2611,6 +2611,7 @@ void gfc_free_forall_iterator (gfc_forall_iterator *);
void gfc_free_alloc_list (gfc_alloc *); void gfc_free_alloc_list (gfc_alloc *);
void gfc_free_namelist (gfc_namelist *); void gfc_free_namelist (gfc_namelist *);
void gfc_free_equiv (gfc_equiv *); void gfc_free_equiv (gfc_equiv *);
void gfc_free_equiv_until (gfc_equiv *, gfc_equiv *);
void gfc_free_data (gfc_data *); void gfc_free_data (gfc_data *);
void gfc_free_case_list (gfc_case *); void gfc_free_case_list (gfc_case *);
......
...@@ -4035,18 +4035,25 @@ gfc_match_module (void) ...@@ -4035,18 +4035,25 @@ gfc_match_module (void)
do this. */ do this. */
void void
gfc_free_equiv (gfc_equiv *eq) gfc_free_equiv_until (gfc_equiv *eq, gfc_equiv *stop)
{ {
if (eq == NULL) if (eq == stop)
return; return;
gfc_free_equiv (eq->eq); gfc_free_equiv (eq->eq);
gfc_free_equiv (eq->next); gfc_free_equiv_until (eq->next, stop);
gfc_free_expr (eq->expr); gfc_free_expr (eq->expr);
gfc_free (eq); gfc_free (eq);
} }
void
gfc_free_equiv (gfc_equiv *eq)
{
gfc_free_equiv_until (eq, NULL);
}
/* Match an EQUIVALENCE statement. */ /* Match an EQUIVALENCE statement. */
match match
......
...@@ -892,6 +892,7 @@ next_statement (void) ...@@ -892,6 +892,7 @@ next_statement (void)
gfc_new_block = NULL; gfc_new_block = NULL;
gfc_current_ns->old_cl_list = gfc_current_ns->cl_list; gfc_current_ns->old_cl_list = gfc_current_ns->cl_list;
gfc_current_ns->old_equiv = gfc_current_ns->equiv;
for (;;) for (;;)
{ {
gfc_statement_label = NULL; gfc_statement_label = NULL;
...@@ -1651,6 +1652,9 @@ reject_statement (void) ...@@ -1651,6 +1652,9 @@ reject_statement (void)
gfc_free_charlen (gfc_current_ns->cl_list, gfc_current_ns->old_cl_list); gfc_free_charlen (gfc_current_ns->cl_list, gfc_current_ns->old_cl_list);
gfc_current_ns->cl_list = gfc_current_ns->old_cl_list; gfc_current_ns->cl_list = gfc_current_ns->old_cl_list;
gfc_free_equiv_until (gfc_current_ns->equiv, gfc_current_ns->old_equiv);
gfc_current_ns->equiv = gfc_current_ns->old_equiv;
gfc_new_block = NULL; gfc_new_block = NULL;
gfc_undo_symbols (); gfc_undo_symbols ();
gfc_clear_warning (); gfc_clear_warning ();
......
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