aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/module.c
diff options
context:
space:
mode:
authorTobias Burnus <tobias@codesourcery.com>2020-04-14 13:57:52 +0200
committerTobias Burnus <tobias@codesourcery.com>2020-04-14 13:57:52 +0200
commit36c3edb1e39c74e2705efac738a389b5597d9d88 (patch)
treedcdde80e293fc0bb3cc264d9ae50151ef19b216a /gcc/fortran/module.c
parent3b0e49a52e1884b501861c128b0a98dec50bdd2e (diff)
downloadgcc-36c3edb1e39c74e2705efac738a389b5597d9d88.zip
gcc-36c3edb1e39c74e2705efac738a389b5597d9d88.tar.gz
gcc-36c3edb1e39c74e2705efac738a389b5597d9d88.tar.bz2
[Fortran] Fix name conflict check for use-assoc (PR 92736)
* module.c (gfc_match_use): Fix name-conflict check for use-associating the same symbol again in a submodule. * gfortran.dg/use_rename_10.f90: New. * gfortran.dg/use_rename_11.f90: New.
Diffstat (limited to 'gcc/fortran/module.c')
-rw-r--r--gcc/fortran/module.c26
1 files changed, 14 insertions, 12 deletions
diff --git a/gcc/fortran/module.c b/gcc/fortran/module.c
index 73a3f20..eccf92b 100644
--- a/gcc/fortran/module.c
+++ b/gcc/fortran/module.c
@@ -648,18 +648,6 @@ gfc_match_use (void)
if (type == INTERFACE_USER_OP)
new_use->op = INTRINSIC_USER;
- st = gfc_find_symtree (gfc_current_ns->sym_root, name);
- if (st && type != INTERFACE_USER_OP)
- {
- if (m == MATCH_YES)
- gfc_error ("Symbol %qs at %L conflicts with the rename symbol "
- "at %L", name, &st->n.sym->declared_at, &loc);
- else
- gfc_error ("Symbol %qs at %L conflicts with the symbol "
- "at %L", name, &st->n.sym->declared_at, &loc);
- goto cleanup;
- }
-
if (use_list->only_flag)
{
if (m != MATCH_YES)
@@ -691,6 +679,20 @@ gfc_match_use (void)
goto cleanup;
}
+ st = gfc_find_symtree (gfc_current_ns->sym_root, name);
+ if (st && type != INTERFACE_USER_OP
+ && (st->n.sym->module != use_list->module_name
+ || strcmp (st->n.sym->name, new_use->use_name) != 0))
+ {
+ if (m == MATCH_YES)
+ gfc_error ("Symbol %qs at %L conflicts with the rename symbol "
+ "at %L", name, &st->n.sym->declared_at, &loc);
+ else
+ gfc_error ("Symbol %qs at %L conflicts with the symbol "
+ "at %L", name, &st->n.sym->declared_at, &loc);
+ goto cleanup;
+ }
+
if (strcmp (new_use->use_name, use_list->module_name) == 0
|| strcmp (new_use->local_name, use_list->module_name) == 0)
{