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" } }