+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
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)
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)
{
+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
--- /dev/null
+! { 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
--- /dev/null
+! { 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