re PR fortran/49074 ([OOP] Defined assignment w/ CLASS arrays: Incomplete error message)
authorMikael Morin <mikael@gcc.gnu.org>
Sat, 15 Jun 2013 21:20:29 +0000 (21:20 +0000)
committerMikael Morin <mikael@gcc.gnu.org>
Sat, 15 Jun 2013 21:20:29 +0000 (21:20 +0000)
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

gcc/fortran/ChangeLog
gcc/fortran/dependency.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/typebound_assignment_5.f03
gcc/testsuite/gfortran.dg/typebound_assignment_6.f03 [new file with mode: 0644]

index 89c2ea4891d5f37bab97b49419f9f9d5b21d2f86..b003bacd70640deda2d7501dfe15de79591eaaed 100644 (file)
@@ -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
index 38921b1993f5923886b68fd66bf6d679ac6d52da..fcdc1e50177222d5cd7b5233d8d1007f40ef1648 100644 (file)
@@ -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)
index 753d94899ced0c912f85dd79589c1c487c64a15b..39381e277deb24e18a0bbe9f93818bffe308646a 100644 (file)
@@ -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.
index 33fc38f3a6577395f278b97b9ecbdc0e1aff308c..3ee4848fc37cb69bef23a3c39447c9bebe62deb2 100644 (file)
@@ -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 (file)
index 0000000..c17de3e
--- /dev/null
@@ -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" } }
+