I intend to apply this 'obvious' patch to trunk and 8-branch tonight, unless there are any objections.
Bootstrapped and regetested on FC27/x86_64. Paul 2018-05-13 Paul Thomas <pa...@gcc.gnu.org> PR fortran/85742 * trans-types.c (gfc_get_dtype_rank_type): Reorder evaluation of 'size'. If the element type is a pointer use the size of the TREE_TYPE of the type, unless it is VOID_TYPE. In this latter case, set the size to zero. 2018-05-13 Paul Thomas <pa...@gcc.gnu.org> PR fortran/85742 * gfortran.dg/assumed_type_9.f90 : New test.
Index: gcc/fortran/trans-types.c =================================================================== *** gcc/fortran/trans-types.c (revision 260208) --- gcc/fortran/trans-types.c (working copy) *************** gfc_get_dtype_rank_type (int rank, tree *** 1518,1523 **** --- 1518,1525 ---- tree field; vec<constructor_elt, va_gc> *v = NULL; + size = TYPE_SIZE_UNIT (etype); + switch (TREE_CODE (etype)) { case INTEGER_TYPE: *************** gfc_get_dtype_rank_type (int rank, tree *** 1546,1567 **** /* We will never have arrays of arrays. */ case ARRAY_TYPE: n = BT_CHARACTER; break; case POINTER_TYPE: n = BT_ASSUMED; break; default: /* TODO: Don't do dtype for temporary descriptorless arrays. */ ! /* We can strange array types for temporary arrays. */ return gfc_index_zero_node; } - size = TYPE_SIZE_UNIT (etype); - if (n == BT_CHARACTER && size == NULL_TREE) - size = TYPE_SIZE_UNIT (TREE_TYPE (etype)); - tmp = get_dtype_type_node (); field = gfc_advance_chain (TYPE_FIELDS (tmp), GFC_DTYPE_ELEM_LEN); --- 1548,1571 ---- /* We will never have arrays of arrays. */ case ARRAY_TYPE: n = BT_CHARACTER; + if (size == NULL_TREE) + size = TYPE_SIZE_UNIT (TREE_TYPE (etype)); break; case POINTER_TYPE: n = BT_ASSUMED; + if (TREE_CODE (TREE_TYPE (etype)) != VOID_TYPE) + size = TYPE_SIZE_UNIT (TREE_TYPE (etype)); + else + size = build_int_cst (size_type_node, 0); break; default: /* TODO: Don't do dtype for temporary descriptorless arrays. */ ! /* We can encounter strange array types for temporary arrays. */ return gfc_index_zero_node; } tmp = get_dtype_type_node (); field = gfc_advance_chain (TYPE_FIELDS (tmp), GFC_DTYPE_ELEM_LEN); Index: gcc/testsuite/gfortran.dg/assumed_type_9.f90 =================================================================== *** gcc/testsuite/gfortran.dg/assumed_type_9.f90 (nonexistent) --- gcc/testsuite/gfortran.dg/assumed_type_9.f90 (working copy) *************** *** 0 **** --- 1,34 ---- + ! { dg-do run } + ! + ! Test the fix for PR85742 in which the descriptors, passed to alsize, + ! for 'a' and 'b' had the wrong element length. + ! + ! Contributed by Cesar Philippidis <ce...@gcc.gnu.org> + ! + program main + implicit none + integer, allocatable :: a + real, pointer :: b + integer, allocatable :: am(:,:) + real, pointer :: bm(:,:) + + allocate (a) + allocate (b) + allocate (am(3,3)) + allocate (bm(4,4)) + + if (sizeof (a) /= alsize (a)) stop 1 + if (sizeof (b) /= alsize (b)) stop 2 + if (sizeof (am) /= alsize (am)) stop 3 + if (sizeof (bm) /= alsize (bm)) stop 4 + + deallocate (b) + deallocate (bm) + contains + function alsize (a) + integer alsize + type (*), dimension (..), contiguous :: a + alsize = sizeof(a) + end function + end program main +