Dear All,

This is a rather trivial patch... going on 'obvious' in fact. However,
I must confess to not being entirely sure why the problem is
occurring. Deferred arrays are emanating from the finalizer that are
being presented as ARRAY_TYPES rather than descriptors. What ever is
the reason, the fix is both safe and does what is required.

Bootstrapped and regtested on FC21/x86_64 - OK for trunk?

Paul

2015-12-18  Paul Thomas  <pa...@gcc.gnu.org>

    PR fortran/68864
    * trans-array.c (evaluate_bound): If deferred, test that 'desc'
    is an array descriptor before using gfc_conv_descriptor_xxx.


2015-12-18  Paul Thomas  <pa...@gcc.gnu.org>

    PR fortran/68864
    * gfortran.dg/pr68864.f90: New test.
Index: gcc/fortran/trans-array.c
===================================================================
*** gcc/fortran/trans-array.c   (revision 231807)
--- gcc/fortran/trans-array.c   (working copy)
*************** evaluate_bound (stmtblock_t *block, tree
*** 3821,3830 ****
        gfc_add_block_to_block (block, &se.pre);
        *output = se.expr;
      }
!   else if (deferred)
      {
        /* The gfc_conv_array_lbound () routine returns a constant zero for
!        deferred length arrays, which in the scalarizer wrecks havoc, when
         copying to a (newly allocated) one-based array.
         Keep returning the actual result in sync for both bounds.  */
        *output = lbound ? gfc_conv_descriptor_lbound_get (desc,
--- 3821,3830 ----
        gfc_add_block_to_block (block, &se.pre);
        *output = se.expr;
      }
!   else if (deferred && GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (desc)))
      {
        /* The gfc_conv_array_lbound () routine returns a constant zero for
!        deferred length arrays, which in the scalarizer wreaks havoc, when
         copying to a (newly allocated) one-based array.
         Keep returning the actual result in sync for both bounds.  */
        *output = lbound ? gfc_conv_descriptor_lbound_get (desc,
Index: gcc/testsuite/gfortran.dg/pr68864.f90
===================================================================
*** gcc/testsuite/gfortran.dg/pr68864.f90       (revision 0)
--- gcc/testsuite/gfortran.dg/pr68864.f90       (working copy)
***************
*** 0 ****
--- 1,43 ----
+ ! { dg-do run }
+ !
+ ! Contributed by Hossein Talebi  <talebi.hoss...@gmail.com>
+ !
+ !
+ Module part_base2_class
+ 
+     implicit none
+ 
+     type :: ty_moc1
+         integer l
+     end type ty_moc1
+     integer,parameter ::  MAX_NUM_ELEMENT_TYPE=32
+ 
+     type :: ty_element_index2
+ 
+         class(ty_moc1),allocatable :: element
+         class(ty_moc1),allocatable :: element_th(:)
+ 
+     endtype ty_element_index2
+ 
+     type :: ty_part_base2
+         type(ty_element_index2)::element_index(MAX_NUM_ELEMENT_TYPE)
+     end type ty_part_base2
+ 
+     class(ty_part_base2),allocatable ::  part_tmp_obj
+ 
+ End Module part_base2_class
+ 
+     use part_base2_class
+     allocate (part_tmp_obj)
+     allocate (part_tmp_obj%element_index(1)%element, source = ty_moc1(1))
+     allocate (part_tmp_obj%element_index(1)%element_th(1), source = 
ty_moc1(99))
+     allocate (part_tmp_obj%element_index(32)%element_th(1), source = 
ty_moc1(999))
+ 
+     do i = 1, MAX_NUM_ELEMENT_TYPE
+       if (allocated (part_tmp_obj%element_index(i)%element_th)) then
+         print *, i, part_tmp_obj%element_index(i)%element_th(1)%l
+       end if
+     end do
+     deallocate (part_tmp_obj)
+ 
+ end

Reply via email to