Hello,

Dominique noticed that the patch also fixed PR56136 whose test is very
close to the one of PR49074.
This made me notice that while the PR56136 test should use a temporary
(and does), the PR49074 one shouldn't.  That is fixed with the attached
patch.
Then the ICE which was fixed by the previous patch isn't
reachable any more in the PR49074 test-case, so I also add a test
based on the PR56136 one.

Regression tested on x86_64-unknown-linux-gnu.  OK for trunk?

Mikael





2013-06-15  Mikael Morin  <mik...@gcc.gnu.org>

        PR fortran/49074
        PR fortran/56136
        * dependency.c (gfc_check_argument_var_dependency): Return 0 in the
        array constructor case.

Index: dependency.c
===================================================================
--- dependency.c        (révision 200067)
+++ dependency.c        (copie de travail)
@@ -990,7 +990,9 @@ gfc_check_argument_var_dependency (gfc_expr *var,
       return 0;
 
     case EXPR_ARRAY:
-      return gfc_check_dependency (var, expr, 1);
+      /* the scalarizer always generates a temporary for array constructors,
+        so there is no dependency.  */
+      return 0;
 
     case EXPR_FUNCTION:
       if (intent != INTENT_IN)
2013-06-15  Mikael Morin  <mik...@gcc.gnu.org>

        PR fortran/49074
        PR fortran/56136
        * gfortran.dg/typebound_assignment_5.f03: Check the absence of any 
packing.
        * gfortran.dg/typebound_assignment_6.f03: New.


Index: typebound_assignment_5.f03
===================================================================
--- typebound_assignment_5.f03  (révision 200070)
+++ typebound_assignment_5.f03  (copie de travail)
@@ -1,4 +1,5 @@
 ! { dg-do run }
+! { dg-options "-fdump-tree-original" }
 !
 ! PR fortran/49074
 ! ICE on defined assignment with class arrays.
@@ -38,3 +39,6 @@
         if (any(foobar%i /= [1, 2])) call abort
       end program
 
+! { dg-final { scan-tree-dump-not "_gfortran_internal_pack" "original" } }
+! { dg-final { scan-tree-dump-not "_gfortran_internal_unpack" "original" } }
+! { dg-final { cleanup-tree-dump "original"} }
! { dg-do run }
! { dg-options "-fdump-tree-original" }
!
! PR fortran/56136
! ICE on defined assignment with class arrays.
!
! Original testcase by Alipasha <alipash.cele...@gmail.com>

      MODULE A_TEST_M
        TYPE :: A_TYPE
          INTEGER :: I
          CONTAINS
          GENERIC :: ASSIGNMENT (=) => ASGN_A
          PROCEDURE, PRIVATE :: ASGN_A
        END TYPE

        CONTAINS

        ELEMENTAL SUBROUTINE ASGN_A (A, B)
          CLASS (A_TYPE), INTENT (INOUT) :: A
          CLASS (A_TYPE), INTENT (IN) :: B
          A%I = B%I
        END SUBROUTINE
      END MODULE A_TEST_M
      
      PROGRAM ASGN_REALLOC_TEST
        USE A_TEST_M
        TYPE (A_TYPE), ALLOCATABLE :: A(:)
        INTEGER :: I, J

        ALLOCATE (A(100))
        A = (/ (A_TYPE(I), I=1,SIZE(A)) /)
        A(1:50) = A(51:100)
        IF (ANY(A%I /= (/ ((50+I, I=1,SIZE(A)/2), J=1,2) /))) CALL ABORT
        A(::2) = A(1:50)        ! pack/unpack
        IF (ANY(A( ::2)%I /= (/ (50+I, I=1,SIZE(A)/2) /))) CALL ABORT  
        IF (ANY(A(2::2)%I /= (/ ((50+2*I, I=1,SIZE(A)/4), J=1,2) /))) CALL 
ABORT  
      END PROGRAM

! { dg-final { scan-tree-dump-times "_gfortran_internal_pack" 1 "original" } }
! { dg-final { scan-tree-dump-times "_gfortran_internal_unpack" 1 "original" } }
! { dg-final { cleanup-tree-dump "original" } }

Reply via email to