http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54426
--- Comment #3 from Tobias Burnus <burnus at gcc dot gnu.org> 2012-08-31
12:30:53 UTC ---
(In reply to comment #2)
> Following Tobias' suggestion on IRC, the patch
> @@ -2890,6 +2890,7 @@ gfc_undo_symbols (void)
> + p->common_block->refs--;
> fixes the PR on powerpc-apple-darwin9 without regression.
But it re-introduces the memory leak. The reason that it works is in
gfc_free_symbol:
if (sym->common_block && sym->common_block->name[0] != '\0')
{
sym->common_block->refs--;
if (sym->common_block->refs == 0)
free (sym->common_block);
If "refs" is 1, doing twice "refs--" makes the latter -1, preventing the
deletion.
The proper fix is to avoid accessing common_root...->n.common after a common
block has been removed via undo_symbols. And the best way to do so is to delete
the common-block symtree in common_root - which is what the patch in comment 1
does.