summaryrefslogtreecommitdiffstats
path: root/gcc/fortran/module.c
diff options
context:
space:
mode:
authorpault <pault@138bc75d-0d04-0410-961f-82ee72b054a4>2006-12-09 20:52:27 +0000
committerpault <pault@138bc75d-0d04-0410-961f-82ee72b054a4>2006-12-09 20:52:27 +0000
commit47b07579d3eda6e5afe4d7163b982f46a7eda082 (patch)
treee1bb0983bc4f7aef81f313ba20585da56a4b546a /gcc/fortran/module.c
parent48a3e2a88420ebebe83cb52ecfbb80eb200b7f1d (diff)
downloadppe42-gcc-47b07579d3eda6e5afe4d7163b982f46a7eda082.tar.gz
ppe42-gcc-47b07579d3eda6e5afe4d7163b982f46a7eda082.zip
2006-11-25 Paul Thomas <pault@gcc.gnu.org>
PR fortran/29464 * module.c (load_generic_interfaces): Add symbols for all the local names of an interface. Share the interface amongst the symbols. * gfortran.h : Add generic_copy to symbol_attribute. * symbol.c (free_symbol): Only free interface if generic_copy is not set. 2006-11-25 Paul Thomas <pault@gcc.gnu.org> PR fortran/29464 * gfortran.dg/module_interface_2.f90: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@119696 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/fortran/module.c')
-rw-r--r--gcc/fortran/module.c44
1 files changed, 30 insertions, 14 deletions
diff --git a/gcc/fortran/module.c b/gcc/fortran/module.c
index 6956fc980c5..7c9c2b1ab3c 100644
--- a/gcc/fortran/module.c
+++ b/gcc/fortran/module.c
@@ -3024,6 +3024,8 @@ load_generic_interfaces (void)
const char *p;
char name[GFC_MAX_SYMBOL_LEN + 1], module[GFC_MAX_SYMBOL_LEN + 1];
gfc_symbol *sym;
+ gfc_interface *generic = NULL;
+ int n, i;
mio_lparen ();
@@ -3034,25 +3036,39 @@ load_generic_interfaces (void)
mio_internal_string (name);
mio_internal_string (module);
- /* Decide if we need to load this one or not. */
- p = find_use_name (name);
+ n = number_use_names (name);
+ n = n ? n : 1;
- if (p == NULL || gfc_find_symbol (p, NULL, 0, &sym))
+ for (i = 1; i <= n; i++)
{
- while (parse_atom () != ATOM_RPAREN);
- continue;
- }
+ /* Decide if we need to load this one or not. */
+ p = find_use_name_n (name, &i);
- if (sym == NULL)
- {
- gfc_get_symbol (p, NULL, &sym);
+ if (p == NULL || gfc_find_symbol (p, NULL, 0, &sym))
+ {
+ while (parse_atom () != ATOM_RPAREN);
+ continue;
+ }
- sym->attr.flavor = FL_PROCEDURE;
- sym->attr.generic = 1;
- sym->attr.use_assoc = 1;
- }
+ if (sym == NULL)
+ {
+ gfc_get_symbol (p, NULL, &sym);
- mio_interface_rest (&sym->generic);
+ sym->attr.flavor = FL_PROCEDURE;
+ sym->attr.generic = 1;
+ sym->attr.use_assoc = 1;
+ }
+ if (i == 1)
+ {
+ mio_interface_rest (&sym->generic);
+ generic = sym->generic;
+ }
+ else
+ {
+ sym->generic = generic;
+ sym->attr.generic_copy = 1;
+ }
+ }
}
mio_rparen ();
OpenPOWER on IntegriCloud