diff options
author | Mikael Morin <mikael@gcc.gnu.org> | 2018-03-28 20:12:55 +0000 |
---|---|---|
committer | Mikael Morin <mikael@gcc.gnu.org> | 2018-03-28 20:12:55 +0000 |
commit | 9b0588e9362bdd86f4cfdbe115e220b38ed23aaa (patch) | |
tree | 17a22f09cca1b588faf489031f615175b1f1a0fc /gcc/fortran/symbol.c | |
parent | e8b8462de61abb0dc136906432e234fa620eb0c8 (diff) | |
download | gcc-9b0588e9362bdd86f4cfdbe115e220b38ed23aaa.zip gcc-9b0588e9362bdd86f4cfdbe115e220b38ed23aaa.tar.gz gcc-9b0588e9362bdd86f4cfdbe115e220b38ed23aaa.tar.bz2 |
re PR fortran/69497 (ICE in gfc_free_namespace, at fortran/symbol.c:3701)
PR fortran/69497
* symbol.c (gfc_symbol_done_2): Start freeing namespaces
from the root.
(gfc_free_namespace): Restore assert (revert r258839).
From-SVN: r258935
Diffstat (limited to 'gcc/fortran/symbol.c')
-rw-r--r-- | gcc/fortran/symbol.c | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/gcc/fortran/symbol.c b/gcc/fortran/symbol.c index 997d90b..546a4fa 100644 --- a/gcc/fortran/symbol.c +++ b/gcc/fortran/symbol.c @@ -4037,10 +4037,11 @@ gfc_free_namespace (gfc_namespace *ns) return; ns->refs--; - - if (ns->refs != 0) + if (ns->refs > 0) return; + gcc_assert (ns->refs == 0); + gfc_free_statements (ns->code); free_sym_tree (ns->sym_root); @@ -4087,8 +4088,14 @@ gfc_symbol_init_2 (void) void gfc_symbol_done_2 (void) { - gfc_free_namespace (gfc_current_ns); - gfc_current_ns = NULL; + if (gfc_current_ns != NULL) + { + /* free everything from the root. */ + while (gfc_current_ns->parent != NULL) + gfc_current_ns = gfc_current_ns->parent; + gfc_free_namespace (gfc_current_ns); + gfc_current_ns = NULL; + } gfc_free_dt_list (); enforce_single_undo_checkpoint (); |