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 | |
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.
-rw-r--r-- | gcc/fortran/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/fortran/module.c | 26 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/use_rename_10.f90 | 28 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/use_rename_11.f90 | 79 |
5 files changed, 131 insertions, 12 deletions
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 <tobias@codesourcery.com> + + * module.c (gfc_match_use): Fix name-conflict check for use-associating + the same symbol again in a submodule. + 2020-04-13 Linus Koenig <link@sig-st.de> 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) { diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 2035cf6..f771586 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2020-04-14 Tobias Burnus <tobias@codesourcery.com> + + * gfortran.dg/use_rename_10.f90: New. + * gfortran.dg/use_rename_11.f90: New. + 2020-04-13 Marek Polacek <polacek@redhat.com> 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 0000000..736d319 --- /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 0000000..b713ae0 --- /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 |