diff options
author | Mikael Morin <mikael@gcc.gnu.org> | 2013-06-15 21:20:29 +0000 |
---|---|---|
committer | Mikael Morin <mikael@gcc.gnu.org> | 2013-06-15 21:20:29 +0000 |
commit | e3f62a5ac17c979b0602899888b3df8a9e0c2101 (patch) | |
tree | 8461b05815615ef20ed87a04ea2f823645bc0f09 | |
parent | 4de09b857ea83e17912dad82a2dddc1047376d41 (diff) | |
download | gcc-e3f62a5ac17c979b0602899888b3df8a9e0c2101.zip gcc-e3f62a5ac17c979b0602899888b3df8a9e0c2101.tar.gz gcc-e3f62a5ac17c979b0602899888b3df8a9e0c2101.tar.bz2 |
re PR fortran/49074 ([OOP] Defined assignment w/ CLASS arrays: Incomplete error message)
fortran/
PR fortran/49074
PR fortran/56136
* dependency.c (gfc_check_argument_var_dependency): Return 0 in the
array constructor case.
testsuite/
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.
From-SVN: r200128
-rw-r--r-- | gcc/fortran/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/fortran/dependency.c | 4 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/typebound_assignment_5.f03 | 4 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/typebound_assignment_6.f03 | 43 |
5 files changed, 65 insertions, 1 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 89c2ea4..b003bac 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,10 @@ +2013-06-15 Mikael Morin <mikael@gcc.gnu.org> + + PR fortran/49074 + PR fortran/56136 + * dependency.c (gfc_check_argument_var_dependency): Return 0 in the + array constructor case. + 2013-06-14 Tobias Burnus <burnus@net-b.de> PR fortran/57508 diff --git a/gcc/fortran/dependency.c b/gcc/fortran/dependency.c index 38921b1..fcdc1e5 100644 --- a/gcc/fortran/dependency.c +++ b/gcc/fortran/dependency.c @@ -990,7 +990,9 @@ gfc_check_argument_var_dependency (gfc_expr *var, sym_intent intent, 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) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 753d948..39381e2 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2013-06-15 Mikael Morin <mikael@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. + 2013-06-15 Oleg Endo <olegendo@gcc.gnu.org> * gcc.target/h8300/h8300.exp: New. diff --git a/gcc/testsuite/gfortran.dg/typebound_assignment_5.f03 b/gcc/testsuite/gfortran.dg/typebound_assignment_5.f03 index 33fc38f..3ee4848 100644 --- a/gcc/testsuite/gfortran.dg/typebound_assignment_5.f03 +++ b/gcc/testsuite/gfortran.dg/typebound_assignment_5.f03 @@ -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"} } diff --git a/gcc/testsuite/gfortran.dg/typebound_assignment_6.f03 b/gcc/testsuite/gfortran.dg/typebound_assignment_6.f03 new file mode 100644 index 0000000..c17de3e --- /dev/null +++ b/gcc/testsuite/gfortran.dg/typebound_assignment_6.f03 @@ -0,0 +1,43 @@ +! { dg-do run } +! { dg-options "-fdump-tree-original" } +! +! PR fortran/56136 +! ICE on defined assignment with class arrays. +! +! Original testcase by Alipasha <alipash.celeris@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" } } + |