Hi all,
the attached patch fixes a bogus warning. The purpose of the warning
is to detect cases where a pointer lives longer than its target. If
the target itself is (1) a pointer or (2) a component of a DT pointer,
we do not know about the lifetime of the target at compile time and no
warning should be thrown. The existing check only handles case (1) and
my patch adds the handling of case (2).
Regtestes cleanly on x86_64-linux-gnu. Ok for trunk and the release branches?
Cheers,
Janus
2017-08-27 Janus Weil <[email protected]>
PR fortran/81770
* expr.c (gfc_check_pointer_assign): Improve the check whether pointer
may outlive pointer target.
2017-08-27 Janus Weil <[email protected]>
PR fortran/81770
* gfortran.dg/warn_target_lifetime_4.f90: New testcase.
Index: gcc/fortran/expr.c
===================================================================
--- gcc/fortran/expr.c (revision 251368)
+++ gcc/fortran/expr.c (working copy)
@@ -3806,7 +3806,8 @@ gfc_check_pointer_assign (gfc_expr *lvalue, gfc_ex
if (warn_target_lifetime
&& rvalue->expr_type == EXPR_VARIABLE
&& !rvalue->symtree->n.sym->attr.save
- && !attr.pointer && !rvalue->symtree->n.sym->attr.host_assoc
+ && !rvalue->symtree->n.sym->attr.pointer && !attr.pointer
+ && !rvalue->symtree->n.sym->attr.host_assoc
&& !rvalue->symtree->n.sym->attr.in_common
&& !rvalue->symtree->n.sym->attr.use_assoc
&& !rvalue->symtree->n.sym->attr.dummy)
! { dg-do compile }
! { dg-options "-Wtarget-lifetime" }
!
! PR fortran/81770: [5/6/7 Regression] Bogus warning: Pointer in pointer assignment might outlive the pointer target
!
! Contributed by Janus Weil <[email protected]>
module m
type t
integer, allocatable :: l
end type
contains
subroutine sub(c_in, list)
type(t), target, intent(in) :: c_in
integer, pointer, intent(out) :: list
type(t), pointer :: container
container => c_in
list => container%l
end subroutine
end