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  <ja...@gcc.gnu.org>

    PR fortran/81770
    * expr.c (gfc_check_pointer_assign): Improve the check whether pointer
    may outlive pointer target.


2017-08-27  Janus Weil  <ja...@gcc.gnu.org>

    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 <ja...@gcc.gnu.org>

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

Reply via email to