diff options
author | pault <pault@138bc75d-0d04-0410-961f-82ee72b054a4> | 2015-09-10 15:22:20 +0000 |
---|---|---|
committer | pault <pault@138bc75d-0d04-0410-961f-82ee72b054a4> | 2015-09-10 15:22:20 +0000 |
commit | 8cff2296abb8f15ab9f417783360444d6361da09 (patch) | |
tree | cbbed0ba7f05f01338b8fe7595098c5464e234d8 /gcc/fortran | |
parent | 6463d309ff8b6bfe1b94be47b95373ad4c4739f5 (diff) | |
download | gcc-8cff2296abb8f15ab9f417783360444d6361da09.tar.gz |
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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@227648 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/fortran')
-rw-r--r-- | gcc/fortran/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/fortran/module.c | 28 |
2 files changed, 27 insertions, 9 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 36ab4716312..4e0d38ff0d1 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,11 @@ +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-04 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org> * intrinsic.h (gfc_simplify_mvbits): Remove. diff --git a/gcc/fortran/module.c b/gcc/fortran/module.c index 621ef36d170..d88969e7d5d 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; |