re PR fortran/89646 (Spurious actual argument might interfere warning)

2019-06-14  Steven G. Kargl  <kargl@gcc.gnu.org>

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

2019-06-14  Steven G. Kargl  <kargl@gcc.gnu.org>

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

From-SVN: r272307
This commit is contained in:
Steven G. Kargl 2019-06-14 18:17:00 +00:00
parent 957ed73861
commit 3fa31ee92a
4 changed files with 44 additions and 5 deletions

View File

@ -1,4 +1,10 @@
2019-06-12 Steven G. Kargl <kargl@gcc.gnu.org>
2019-06-14 Steven G. Kargl <kargl@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 <kargl@gcc.gnu.org>
PR fortran/68544
* resolve.c (is_dt_name): New function to compare symbol name against

View File

@ -979,10 +979,14 @@ gfc_check_argument_var_dependency (gfc_expr *var, sym_intent intent,
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;
}

View File

@ -1,3 +1,8 @@
2019-06-14 Steven G. Kargl <kargl@gcc.gnu.org>
PR fortran/89646
* gfortran.dg/pr89646.f90: New test.
2019-06-14 H.J. Lu <hongjiu.lu@intel.com>
PR rtl-optimization/90765

View File

@ -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