OSDN Git Service

2013-04-12 Tobias Burnus <burnus@net-b.de>
authorburnus <burnus@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 12 Apr 2013 17:55:48 +0000 (17:55 +0000)
committerburnus <burnus@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 12 Apr 2013 17:55:48 +0000 (17:55 +0000)
        PR fortran/56929
        * trans-array.c (duplicate_allocatable): Fix handling
        of scalar coarrays.

2013-04-12  Tobias Burnus  <burnus@net-b.de>

        PR fortran/56929
        * gfortran.dg/coarray/alloc_comp_2.f90: New.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@197930 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/fortran/ChangeLog
gcc/fortran/trans-array.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/coarray/alloc_comp_2.f90 [new file with mode: 0644]

index e290e49..c2b8a5d 100644 (file)
@@ -1,3 +1,9 @@
+2013-04-12  Tobias Burnus  <burnus@net-b.de>
+
+       PR fortran/56929
+       * trans-array.c (duplicate_allocatable): Fix handling
+       of scalar coarrays.
+
 2013-04-12  Janus Weil  <janus@gcc.gnu.org>
 
        PR fortran/56261
index 05de50d..6cb85d4 100644 (file)
@@ -7321,7 +7321,7 @@ duplicate_allocatable (tree dest, tree src, tree type, int rank,
      allocate memory to the destination.  */
   gfc_init_block (&block);
 
-  if (rank == 0)
+  if (!GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (dest)))
     {
       tmp = null_pointer_node;
       tmp = fold_build2_loc (input_location, MODIFY_EXPR, type, dest, tmp);
@@ -7348,7 +7348,11 @@ duplicate_allocatable (tree dest, tree src, tree type, int rank,
       null_data = gfc_finish_block (&block);
 
       gfc_init_block (&block);
-      nelems = get_full_array_size (&block, src, rank);
+      if (rank)
+       nelems = get_full_array_size (&block, src, rank);
+      else
+       nelems = gfc_index_one_node;
+
       tmp = fold_convert (gfc_array_index_type,
                          TYPE_SIZE_UNIT (gfc_get_element_type (type)));
       size = fold_build2_loc (input_location, MULT_EXPR, gfc_array_index_type,
@@ -7374,7 +7378,7 @@ duplicate_allocatable (tree dest, tree src, tree type, int rank,
 
   /* Null the destination if the source is null; otherwise do
      the allocate and copy.  */
-  if (rank == 0)
+  if (!GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (src)))
     null_cond = src;
   else
     null_cond = gfc_conv_descriptor_data_get (src);
index b4fefc5..2f505a4 100644 (file)
@@ -1,3 +1,8 @@
+2013-04-12  Tobias Burnus  <burnus@net-b.de>
+
+       PR fortran/56929
+       * gfortran.dg/coarray/alloc_comp_2.f90: New.
+
 2013-04-12  Vladimir Makarov  <vmakarov@redhat.com>
 
        PR target/56903
diff --git a/gcc/testsuite/gfortran.dg/coarray/alloc_comp_2.f90 b/gcc/testsuite/gfortran.dg/coarray/alloc_comp_2.f90
new file mode 100644 (file)
index 0000000..13c823e
--- /dev/null
@@ -0,0 +1,19 @@
+! { dg-do compile }
+!
+! PR fortran/56929
+!
+! Contributed by Damian Rouson
+!
+! Allocatable scalar corrays were mishandled (ICE)
+!
+module parent_coarray_component
+  type parent
+    real, allocatable :: dummy[:]
+  end type
+  type, extends(parent) :: child
+  end type
+contains
+  subroutine do_something(this)
+    class(child) this
+  end 
+end