[Fortran] Fix name conflict check for use-assoc (PR 92736)
authorTobias Burnus <tobias@codesourcery.com>
Tue, 14 Apr 2020 11:57:52 +0000 (13:57 +0200)
committerTobias Burnus <tobias@codesourcery.com>
Tue, 14 Apr 2020 11:57:52 +0000 (13:57 +0200)
* 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/ChangeLog
gcc/fortran/module.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/use_rename_10.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/use_rename_11.f90 [new file with mode: 0644]

index 96835dea4bf4f95ab024b2673742d40474fbc066..9473ecbe1bbaf30eca3b66e1ac4a258ccc654ecd 100644 (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
index 73a3f202834fa2498cb4fffb79b52ac45a3d2464..eccf92bf658ab2eb6f7079195a2b90403c6ba3c4 100644 (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)
            {
index 2035cf6fd1faa4986feb2a4c3994ca5dab6682d5..f771586d6052d77bc75226e112735f1b39e09fbb 100644 (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
diff --git a/gcc/testsuite/gfortran.dg/use_rename_10.f90 b/gcc/testsuite/gfortran.dg/use_rename_10.f90
new file mode 100644 (file)
index 0000000..736d319
--- /dev/null
@@ -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 (file)
index 0000000..b713ae0
--- /dev/null
@@ -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