re PR fortran/91485 (Erroneous conflict between variable x and operator(.x.))
authorSteven G. Kargl <kargl@gcc.gnu.org>
Mon, 19 Aug 2019 03:00:54 +0000 (03:00 +0000)
committerSteven G. Kargl <kargl@gcc.gnu.org>
Mon, 19 Aug 2019 03:00:54 +0000 (03:00 +0000)
2019-08-18  Steven G. Kargl  <kargl@gcc.gnu.org>

PR fortran/91485
module.c (gfc_match_use): User defined operator cannot conflict with
a rename symbol.

2019-08-18  Steven G. Kargl  <kargl@gcc.gnu.org>

PR fortran/91485
* gfortran.dg/pr91485.f90: New test.

From-SVN: r274630

gcc/fortran/ChangeLog
gcc/fortran/module.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/pr91485.f90 [new file with mode: 0644]

index 9af58369cc1b8b90b9954aafee67f189b608e320..8cca6179eb84b3f31d2b77c2dad4ecaebc6e86ea 100644 (file)
@@ -1,3 +1,9 @@
+2019-08-18  Steven G. Kargl  <kargl@gcc.gnu.org>
+
+       PR fortran/91485
+       module.c (gfc_match_use): User defined operator cannot conflict with
+       a rename symbol.
+
 2019-08-17  Steven G. Kargl  <kargl@gcc.gnu.org>
 
        PR fortran/82992
index fb6173dcde3bd45ef1504733e9ccac0d1d14fbb7..533445e2655ed9c660a55ada48d9d8bdd9b68526 100644 (file)
@@ -647,7 +647,7 @@ gfc_match_use (void)
            new_use->op = INTRINSIC_USER;
 
          st = gfc_find_symtree (gfc_current_ns->sym_root, name);
-         if (st)
+         if (st && type != INTERFACE_USER_OP)
            {
              if (m == MATCH_YES)
                gfc_error ("Symbol %qs at %L conflicts with the rename symbol "
index 0eb47a644b2904f8d680c95dc70898d68c3d988d..dc44897e743bbc7895ae426d4e53af0cd4166fee 100644 (file)
@@ -1,3 +1,8 @@
+2019-08-18  Steven G. Kargl  <kargl@gcc.gnu.org>
+
+       PR fortran/91485
+       * gfortran.dg/pr91485.f90: New test.
+
 2019-08-17  Steven G. Kargl  <kargl@gcc.gnu.org>
 
        PR fortran/82992
diff --git a/gcc/testsuite/gfortran.dg/pr91485.f90 b/gcc/testsuite/gfortran.dg/pr91485.f90
new file mode 100644 (file)
index 0000000..a6d0687
--- /dev/null
@@ -0,0 +1,24 @@
+! { dg-do compile }
+module foo
+   implicit none
+   interface operator(.x.)
+      module procedure product
+   end interface operator(.x.)
+   contains
+      function product(x, y)
+         real, intent(in) :: x, y
+         real :: product
+         product = x * y
+      end function product
+end module foo
+
+module gfcbug155
+   implicit none
+   contains
+      subroutine print_prod (x, y)
+         use foo, only : operator(.x.)
+         implicit none
+         real :: x, y
+         print *, x .x. y
+      end subroutine print_prod
+end module gfcbug155