diff options
author | Tobias Burnus <tobias@codesourcery.com> | 2020-04-14 13:57:52 +0200 |
---|---|---|
committer | Tobias Burnus <tobias@codesourcery.com> | 2020-04-14 13:57:52 +0200 |
commit | 36c3edb1e39c74e2705efac738a389b5597d9d88 (patch) | |
tree | dcdde80e293fc0bb3cc264d9ae50151ef19b216a /gcc/fortran/module.c | |
parent | 3b0e49a52e1884b501861c128b0a98dec50bdd2e (diff) | |
download | gcc-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.c | 26 |
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) { |