aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMikael Morin <mikael@gcc.gnu.org>2013-06-15 21:20:29 +0000
committerMikael Morin <mikael@gcc.gnu.org>2013-06-15 21:20:29 +0000
commite3f62a5ac17c979b0602899888b3df8a9e0c2101 (patch)
tree8461b05815615ef20ed87a04ea2f823645bc0f09
parent4de09b857ea83e17912dad82a2dddc1047376d41 (diff)
downloadgcc-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/ChangeLog7
-rw-r--r--gcc/fortran/dependency.c4
-rw-r--r--gcc/testsuite/ChangeLog8
-rw-r--r--gcc/testsuite/gfortran.dg/typebound_assignment_5.f034
-rw-r--r--gcc/testsuite/gfortran.dg/typebound_assignment_6.f0343
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" } }
+