[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:
parent
3b0e49a52e
commit
36c3edb1e3
5 changed files with 131 additions and 12 deletions
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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
|
||||
|
|
28
gcc/testsuite/gfortran.dg/use_rename_10.f90
Normal file
28
gcc/testsuite/gfortran.dg/use_rename_10.f90
Normal 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
|
79
gcc/testsuite/gfortran.dg/use_rename_11.f90
Normal file
79
gcc/testsuite/gfortran.dg/use_rename_11.f90
Normal 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
|
Loading…
Add table
Reference in a new issue