diff options
author | Paul Thomas <pault@gcc.gnu.org> | 2015-09-10 15:22:20 +0000 |
---|---|---|
committer | Paul Thomas <pault@gcc.gnu.org> | 2015-09-10 15:22:20 +0000 |
commit | 0815fd250302b45a3aadd9b32d8559c7b47d86e4 (patch) | |
tree | cbbed0ba7f05f01338b8fe7595098c5464e234d8 /gcc/fortran/module.c | |
parent | c661ca7956246394a9e440d14d5e57a195cc6eb9 (diff) | |
download | gcc-0815fd250302b45a3aadd9b32d8559c7b47d86e4.zip gcc-0815fd250302b45a3aadd9b32d8559c7b47d86e4.tar.gz gcc-0815fd250302b45a3aadd9b32d8559c7b47d86e4.tar.bz2 |
re PR fortran/66993 (Spurious ambiguous symbol error with submodules)
2015-09-10 Paul Thomas <pault@gcc.gnu.org>
PR fortran/66993
* module.c (read_module): If a symtree exists and the symbol has
been associated in a submodule from a parent (sub)module, attach
the symbol to a 'unique symtree' and the new symbol to the
existing symtree.
2015-09-10 Paul Thomas <pault@gcc.gnu.org>
PR fortran/66993
* gfortran.dg/submodule_11.f08: New test.
From-SVN: r227648
Diffstat (limited to 'gcc/fortran/module.c')
-rw-r--r-- | gcc/fortran/module.c | 28 |
1 files changed, 19 insertions, 9 deletions
diff --git a/gcc/fortran/module.c b/gcc/fortran/module.c index 621ef36..d88969e 100644 --- a/gcc/fortran/module.c +++ b/gcc/fortran/module.c @@ -5132,7 +5132,8 @@ read_module (void) st = gfc_find_symtree (gfc_current_ns->sym_root, p); - if (st != NULL) + if (st != NULL + && !(st->n.sym && st->n.sym->attr.used_in_submodule)) { /* Check for ambiguous symbols. */ if (check_for_ambiguous (st, info)) @@ -5142,14 +5143,23 @@ read_module (void) } else { - st = gfc_find_symtree (gfc_current_ns->sym_root, name); - - /* Create a symtree node in the current namespace for this - symbol. */ - st = check_unique_name (p) - ? gfc_get_unique_symtree (gfc_current_ns) - : gfc_new_symtree (&gfc_current_ns->sym_root, p); - st->ambiguous = ambiguous; + if (st) + { + /* This symbol is host associated from a module in a + submodule. Hide it with a unique symtree. */ + gfc_symtree *s = gfc_get_unique_symtree (gfc_current_ns); + s->n.sym = st->n.sym; + st->n.sym = NULL; + } + else + { + /* Create a symtree node in the current namespace for this + symbol. */ + st = check_unique_name (p) + ? gfc_get_unique_symtree (gfc_current_ns) + : gfc_new_symtree (&gfc_current_ns->sym_root, p); + st->ambiguous = ambiguous; + } sym = info->u.rsym.sym; |