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