The attached patch suppresses the spurious warnings that
would otherwise occur for the testcase.  Regression
tested cleanly on x86_64-*-freebsd.  OK to commit?

2019-06-13  Steven G. Kargl  <ka...@gcc.gnu.org>

        PR fortran/89646
        * dependency.c (gfc_check_argument_var_dependency): Suppress spurious
        warnings by comparing variable names.

2019-06-13  Steven G. Kargl  <ka...@gcc.gnu.org>

        PR fortran/89646
        * gfortran.dg/pr89646.f90: New test.

-- 
Steve
Index: gcc/fortran/dependency.c
===================================================================
--- gcc/fortran/dependency.c	(revision 272257)
+++ gcc/fortran/dependency.c	(working copy)
@@ -979,10 +979,14 @@ gfc_check_argument_var_dependency (gfc_expr *var, sym_
 		     If a dependency is found in the case
 		     elemental == ELEM_CHECK_VARIABLE, we will generate
 		     a temporary, so we don't need to bother the user.  */
-		  gfc_warning (0, "INTENT(%s) actual argument at %L might "
-			       "interfere with actual argument at %L.",
-		   	       intent == INTENT_OUT ? "OUT" : "INOUT",
-		   	       &var->where, &expr->where);
+
+		  if (var->expr_type == EXPR_VARIABLE
+		      && expr->expr_type == EXPR_VARIABLE
+		      && strcmp(var->symtree->name, expr->symtree->name) == 0)
+		    gfc_warning (0, "INTENT(%s) actual argument at %L might "
+				 "interfere with actual argument at %L.",
+				 intent == INTENT_OUT ? "OUT" : "INOUT",
+				 &var->where, &expr->where);
 		}
 	      return 0;
 	    }
Index: gcc/testsuite/gfortran.dg/pr89646.f90
===================================================================
--- gcc/testsuite/gfortran.dg/pr89646.f90	(nonexistent)
+++ gcc/testsuite/gfortran.dg/pr89646.f90	(working copy)
@@ -0,0 +1,24 @@
+! { dg-do compile }
+! PR fortran/89646
+! Original testcase contributed by Ian Harvey <ian_harvey at bigpond dot com>
+!
+! This code use to give spurious warnings about aliasing.
+!
+module m
+   implicit none
+   type :: t
+   end type t
+   contains
+      ! To reproduce, both actual arguments must be TARGET, 
+      ! both arguments must be of derived type.
+      subroutine s
+         type(t), target :: a(5)
+         type(t), target :: b(5)
+         call move(a, b)
+      end subroutine s
+      ! To reproduce, called procedure must be elemental.
+      elemental subroutine move(x, y)
+         type(t), intent(inout) :: x
+         type(t), intent(out) :: y
+      end subroutine move
+end module m

Reply via email to