From 36c3edb1e39c74e2705efac738a389b5597d9d88 Mon Sep 17 00:00:00 2001 From: Tobias Burnus Date: Tue, 14 Apr 2020 13:57:52 +0200 Subject: [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. --- gcc/fortran/ChangeLog | 5 +++++ gcc/fortran/module.c | 26 ++++++++++++++------------ 2 files changed, 19 insertions(+), 12 deletions(-) (limited to 'gcc/fortran') diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 96835de..9473ecb 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,8 @@ +2020-04-14 Tobias Burnus + + * module.c (gfc_match_use): Fix name-conflict check for use-associating + the same symbol again in a submodule. + 2020-04-13 Linus Koenig PR fortran/94192 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) { -- cgit v1.1