Index: gcc/fortran/module.c =================================================================== --- gcc/fortran/module.c (révision 113192) +++ gcc/fortran/module.c (copie de travail) @@ -182,8 +182,11 @@ static pointer_info *pi_root; static int symbol_number; /* Counter for assigning symbol numbers */ +/* Tells mio_expr_ref not to load unused equivalence members. */ +static bool in_load_equiv; + /*****************************************************************/ /* Pointer/integer conversion. Pointers between structures are stored @@ -2135,6 +2138,11 @@ { require_atom (ATOM_INTEGER); p = get_integer (atom_int); + + /* An unused equivalence member; bail out. */ + if (in_load_equiv && p->u.rsym.symtree == NULL) + return; + if (p->type == P_UNKNOWN) p->type = P_SYMBOL; @@ -3008,14 +3016,18 @@ mio_rparen(); } -/* load_equiv()-- Load equivalences. */ +/* load_equiv()-- Load equivalences. The flag in_load_equiv informs + mio_expr_ref of this so that unused variables are not loaded and + so that the expression can be safely freed.*/ static void load_equiv(void) { - gfc_equiv *head, *tail, *end; + gfc_equiv *head, *tail, *end, *eq; + bool unused; mio_lparen(); + in_load_equiv = true; end = gfc_current_ns->equiv; while(end != NULL && end->next != NULL) @@ -3039,16 +3051,40 @@ mio_expr(&tail->expr); } + /* Unused variables have no symtree. */ + unused = false; + for (eq = head; eq; eq = eq->eq) + { + if (!(eq && eq->expr && eq->expr->symtree)) + { + unused = true; + break; + } + } + + if (unused) + { + for (eq = head; eq; eq = head) + { + head = eq->eq; + gfc_free_expr (eq->expr); + gfc_free (eq); + } + } + if (end == NULL) gfc_current_ns->equiv = head; else end->next = head; - end = head; + if (head != NULL) + end = head; + mio_rparen(); } mio_rparen(); + in_load_equiv = false; } /* Recursive function to traverse the pointer_info tree and load a Index: gcc/fortran/trans-common.c =================================================================== --- gcc/fortran/trans-common.c (révision 113192) +++ gcc/fortran/trans-common.c (copie de travail) @@ -1057,9 +1057,10 @@ /* Translate all named common blocks. */ gfc_traverse_symtree (ns->common_root, named_common); - /* Commit the newly created symbols for common blocks. */ - gfc_commit_symbols (); - /* Translate local equivalence. */ finish_equivalences (ns); + + /* Commit the newly created symbols for common blocks and module + equivalences. */ + gfc_commit_symbols (); }