re PR fortran/69497 (ICE in gfc_free_namespace, at fortran/symbol.c:3701)
authorMikael Morin <mikael@gcc.gnu.org>
Wed, 28 Mar 2018 20:12:55 +0000 (20:12 +0000)
committerMikael Morin <mikael@gcc.gnu.org>
Wed, 28 Mar 2018 20:12:55 +0000 (20:12 +0000)
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

gcc/fortran/ChangeLog
gcc/fortran/symbol.c

index 85fcaae0890c13b0a2135b7bd272d05787cba95f..9c13ff060c3cc502078c28f661a4fe939a42be39 100644 (file)
@@ -1,3 +1,10 @@
+2018-03-28  Mikael Morin  <mikael@gcc.gnu.org>
+
+       PR fortran/69497
+       * symbol.c (gfc_symbol_done_2): Start freeing namespaces
+       from the root.
+       (gfc_free_namespace): Restore assert (revert r258839). 
+
 2018-03-28  Jakub Jelinek  <jakub@redhat.com>
 
        * gfortran.h (gfc_dt): Rename default_exp field to dec_ext.
index 997d90b00fd4df7a232b8894c89a4b16b4021ea6..546a4fae0a8a1444880afa8658f6bd05a94b3933 100644 (file)
@@ -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 ();