Hi all,

this issue only occurs when use associating a symbol in a module
and then again use-associating the same symbol in its submodule.

If one simply uses
  use m, only: i
  use m, only: i
the issue does not occur as all symbols are only created after
parsing all use statements.

And for
  use m, only: i
contains
  subroutine sub()
    use m, only: i
one has different gfc_namespaces such that they cannot conflict.

This is a GCC 9 + mainline/10 regression, hence:
OK for those two branches?

Tobias

-----------------
Mentor Graphics (Deutschland) GmbH, Arnulfstraße 201, 80634 München / Germany
Registergericht München HRB 106955, Geschäftsführer: Thomas Heurung, Alexander 
Walter
[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.

 gcc/fortran/module.c                        | 26 +++++-----
 gcc/testsuite/gfortran.dg/use_rename_10.f90 | 28 ++++++++++
 gcc/testsuite/gfortran.dg/use_rename_11.f90 | 79 +++++++++++++++++++++++++++++
 3 files changed, 121 insertions(+), 12 deletions(-)

diff --git a/gcc/fortran/module.c b/gcc/fortran/module.c
index 73a3f202834..eccf92bf658 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/gfortran.dg/use_rename_10.f90 b/gcc/testsuite/gfortran.dg/use_rename_10.f90
new file mode 100644
index 00000000000..736d319c5a9
--- /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 00000000000..b713ae01d36
--- /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

Reply via email to