aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMikael Morin <mikael@gcc.gnu.org>2018-03-28 20:12:55 +0000
committerMikael Morin <mikael@gcc.gnu.org>2018-03-28 20:12:55 +0000
commit9b0588e9362bdd86f4cfdbe115e220b38ed23aaa (patch)
tree17a22f09cca1b588faf489031f615175b1f1a0fc /gcc
parente8b8462de61abb0dc136906432e234fa620eb0c8 (diff)
downloadgcc-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')
-rw-r--r--gcc/fortran/ChangeLog7
-rw-r--r--gcc/fortran/symbol.c15
2 files changed, 18 insertions, 4 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 85fcaae..9c13ff0 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -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.
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 ();