aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/parse.c
diff options
context:
space:
mode:
authorTobias Burnus <burnus@net-b.de>2012-08-27 14:07:43 +0200
committerTobias Burnus <burnus@gcc.gnu.org>2012-08-27 14:07:43 +0200
commit6f79f4d1d6c6e3dcb0231404969882726d31a50c (patch)
tree35954802481b336b7827eb81f61dda5ed4be17f6 /gcc/fortran/parse.c
parent1d6368551e85cac41df6df4234d865918b693319 (diff)
downloadgcc-6f79f4d1d6c6e3dcb0231404969882726d31a50c.zip
gcc-6f79f4d1d6c6e3dcb0231404969882726d31a50c.tar.gz
gcc-6f79f4d1d6c6e3dcb0231404969882726d31a50c.tar.bz2
re PR fortran/41093 (memory leaks with gfc_namespace)
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. From-SVN: r190710
Diffstat (limited to 'gcc/fortran/parse.c')
-rw-r--r--gcc/fortran/parse.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/gcc/fortran/parse.c b/gcc/fortran/parse.c
index c0ec6e4..5c5d381 100644
--- a/gcc/fortran/parse.c
+++ b/gcc/fortran/parse.c
@@ -2363,7 +2363,6 @@ parse_interface (void)
gfc_interface_info save;
gfc_state_data s1, s2;
gfc_statement st;
- locus proc_locus;
accept_statement (ST_INTERFACE);
@@ -2452,7 +2451,9 @@ loop:
accept_statement (st);
prog_unit = gfc_new_block;
prog_unit->formal_ns = gfc_current_ns;
- proc_locus = gfc_current_locus;
+ if (prog_unit == prog_unit->formal_ns->proc_name
+ && prog_unit->ns != prog_unit->formal_ns)
+ prog_unit->refs++;
decl:
/* Read data declaration statements. */
@@ -2493,7 +2494,8 @@ decl:
&& strcmp (current_interface.ns->proc_name->name,
prog_unit->name) == 0)
gfc_error ("INTERFACE procedure '%s' at %L has the same name as the "
- "enclosing procedure", prog_unit->name, &proc_locus);
+ "enclosing procedure", prog_unit->name,
+ &current_interface.ns->proc_name->declared_at);
goto loop;