summaryrefslogtreecommitdiff
path: root/gcc/fortran/symbol.c
diff options
context:
space:
mode:
authorburnus <burnus@138bc75d-0d04-0410-961f-82ee72b054a4>2012-08-27 12:07:43 +0000
committerburnus <burnus@138bc75d-0d04-0410-961f-82ee72b054a4>2012-08-27 12:07:43 +0000
commit94544b87c0da9294bfc2d546a3e08266bfa4a3ba (patch)
tree35954802481b336b7827eb81f61dda5ed4be17f6 /gcc/fortran/symbol.c
parent8bc18b79d5d2ee8a2a30b7808bf1c2e3bc1d5560 (diff)
downloadgcc-94544b87c0da9294bfc2d546a3e08266bfa4a3ba.tar.gz
2012-08-27 Tobias Burnus <burnus@net-b.de>
PR fortran/41093 * gfortran.h (gfc_common_head): Add "int refs". * match.c (gfc_match_common): Increment refs. * resolve.c (resolve_symbol): Only increment formal_ns->refs if formal_ns is not sym->ns. * symbol.c (gfc_free_symbol): Only free formal_ns if if formal_ns is not sym->ns. Free common_block if refs is one. (gfc_release_symbol): Release formal_ns only if the symbol is not ENTRY of a module. * decl.c (get_proc_name): Don't increment gfc_current_ns->refs. * parse.c (parse_interface): Incement proc_unit->refs++ for proc-pointer result variables. * module.c (mio_symbol): Don't increase sym->refs for its use in sym->formal_ns->proc_name. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@190710 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/fortran/symbol.c')
-rw-r--r--gcc/fortran/symbol.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/gcc/fortran/symbol.c b/gcc/fortran/symbol.c
index 5a1e5adb85c..4d030b76fc1 100644
--- a/gcc/fortran/symbol.c
+++ b/gcc/fortran/symbol.c
@@ -2511,7 +2511,8 @@ gfc_free_symbol (gfc_symbol *sym)
gfc_free_namelist (sym->namelist);
- gfc_free_namespace (sym->formal_ns);
+ if (sym->ns != sym->formal_ns)
+ gfc_free_namespace (sym->formal_ns);
if (!sym->attr.generic_copy)
gfc_free_interface (sym->generic);
@@ -2520,6 +2521,13 @@ gfc_free_symbol (gfc_symbol *sym)
gfc_free_namespace (sym->f2k_derived);
+ if (sym->common_block && sym->common_block->name[0] != '\0')
+ {
+ sym->common_block->refs--;
+ if (sym->common_block->refs == 0)
+ free (sym->common_block);
+ }
+
free (sym);
}
@@ -2532,7 +2540,8 @@ gfc_release_symbol (gfc_symbol *sym)
if (sym == NULL)
return;
- if (sym->formal_ns != NULL && sym->refs == 2)
+ if (sym->formal_ns != NULL && sym->refs == 2 && sym->formal_ns != sym->ns
+ && (!sym->attr.entry || !sym->module))
{
/* As formal_ns contains a reference to sym, delete formal_ns just
before the deletion of sym. */