From 36c3edb1e39c74e2705efac738a389b5597d9d88 Mon Sep 17 00:00:00 2001 From: Tobias Burnus Date: Tue, 14 Apr 2020 13:57:52 +0200 Subject: [PATCH] [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 +++---- gcc/testsuite/ChangeLog | 5 ++ gcc/testsuite/gfortran.dg/use_rename_10.f90 | 28 ++++++++ gcc/testsuite/gfortran.dg/use_rename_11.f90 | 79 +++++++++++++++++++++ 5 files changed, 131 insertions(+), 12 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/use_rename_10.f90 create mode 100644 gcc/testsuite/gfortran.dg/use_rename_11.f90 diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 96835dea4bf..9473ecbe1bb 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 73a3f202834..eccf92bf658 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) { diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 2035cf6fd1f..f771586d605 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2020-04-14 Tobias Burnus + + * gfortran.dg/use_rename_10.f90: New. + * gfortran.dg/use_rename_11.f90: New. + 2020-04-13 Marek Polacek PR c++/94588 diff --git a/gcc/testsuite/gfortran.dg/use_rename_10.f90 b/gcc/testsuite/gfortran.dg/use_rename_10.f90 new file mode 100644 index 00000000000..736d319c5a9 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/use_rename_10.f90 @@ -0,0 +1,28 @@ +! { dg-do compile } +! +! PR fortran/92736 +! +! Contributed by Chinoune Mehdi +! +module m1 + implicit none + integer, parameter :: i = 10 +end module m1 + +module m2 + use m1, only : i + implicit none + interface + module subroutine sb1() + end subroutine sb1 + end interface +end module m2 + +submodule(m2) s1 + use m1, only : i + implicit none +contains + module subroutine sb1 + print *,"hello", i + end subroutine sb1 +end submodule s1 diff --git a/gcc/testsuite/gfortran.dg/use_rename_11.f90 b/gcc/testsuite/gfortran.dg/use_rename_11.f90 new file mode 100644 index 00000000000..b713ae01d36 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/use_rename_11.f90 @@ -0,0 +1,79 @@ +! { dg-do compile } +! +! PR fortran/92736 +! +module m + integer :: i, j +end module m + +module m2 + integer :: i, k +end module m2 + +module mod + use m, only: i + interface + module subroutine sb1() + end subroutine sb1 + end interface +end + +! Error: use 'i' both for m's 'i' and 'j' +submodule(mod) sub ! { dg-error "Symbol 'i' at .1. conflicts with the rename symbol" } + use m1, only: i => j ! { dg-error "Symbol 'i' at .1. conflicts with the rename symbol" } +end + +module mod2 + use m, only: i + interface + module subroutine sb1() + end subroutine sb1 + end interface +end + +! Error: use 'i' both for m's 'i' and m2's 'k' +submodule(mod2) sub2 ! { dg-error "Symbol 'i' at .1. conflicts with the rename symbol" } + use m2, only: i => k ! { dg-error "Symbol 'i' at .1. conflicts with the rename symbol" } +end + + +module mod3 + use m, only: i + interface + module subroutine sb1() + end subroutine sb1 + end interface +end + +! Error: use 'i' both for m's 'i' and m2's 'i' +submodule(mod3) sub3 ! { dg-error "Symbol 'i' at .1. conflicts with the symbol" } + use m2, only: i ! { dg-error "Symbol 'i' at .1. conflicts with the symbol" } +end + + +module mod4 + use m, only: mm => i, i + interface + module subroutine sb1() + end subroutine sb1 + end interface +end + +! OK +submodule(mod4) sub4 + use m, only: i + use m, only: mm => i +end + +module mod5 + use m, only: mm => i + interface + module subroutine sb1() + end subroutine sb1 + end interface +end + +! mm from both m2 and m +submodule(mod5) sub5 ! { dg-error "Symbol 'mm' at .1. conflicts with the rename symbol" } + use m2, only: mm => i ! { dg-error "Symbol 'mm' at .1. conflicts with the rename symbol" } +end -- 2.30.2