From 0815fd250302b45a3aadd9b32d8559c7b47d86e4 Mon Sep 17 00:00:00 2001 From: Paul Thomas Date: Thu, 10 Sep 2015 15:22:20 +0000 Subject: re PR fortran/66993 (Spurious ambiguous symbol error with submodules) 2015-09-10 Paul Thomas 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 PR fortran/66993 * gfortran.dg/submodule_11.f08: New test. From-SVN: r227648 --- gcc/fortran/module.c | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) (limited to 'gcc/fortran/module.c') 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; -- cgit v1.1