[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.
This commit is contained in:
Tobias Burnus 2020-04-14 13:57:52 +02:00
parent 3b0e49a52e
commit 36c3edb1e3
5 changed files with 131 additions and 12 deletions

View file

@ -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

View file

@ -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)
{

View file

@ -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

View file

@ -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

View file

@ -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