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