re PR fortran/85742 (sizeof allocatable arrays returning wrong value)

2018-05-13  Paul Thomas  <pault@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  <pault@gcc.gnu.org>

	PR fortran/85742
	* gfortran.dg/assumed_type_9.f90 : New test.

From-SVN: r260211
This commit is contained in:
Paul Thomas 2018-05-13 17:01:16 +00:00
parent 798a67a4ce
commit f094a21f31
4 changed files with 57 additions and 6 deletions

View File

@ -1,3 +1,11 @@
2018-05-13 Paul Thomas <pault@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 Steven G. Kargl <kargl@gcc.gnu.org> 2018-05-13 Steven G. Kargl <kargl@gcc.gnu.org>
* gfortran.h: Remove prototype. * gfortran.h: Remove prototype.

View File

@ -1518,6 +1518,8 @@ gfc_get_dtype_rank_type (int rank, tree etype)
tree field; tree field;
vec<constructor_elt, va_gc> *v = NULL; vec<constructor_elt, va_gc> *v = NULL;
size = TYPE_SIZE_UNIT (etype);
switch (TREE_CODE (etype)) switch (TREE_CODE (etype))
{ {
case INTEGER_TYPE: case INTEGER_TYPE:
@ -1546,22 +1548,24 @@ gfc_get_dtype_rank_type (int rank, tree etype)
/* We will never have arrays of arrays. */ /* We will never have arrays of arrays. */
case ARRAY_TYPE: case ARRAY_TYPE:
n = BT_CHARACTER; n = BT_CHARACTER;
if (size == NULL_TREE)
size = TYPE_SIZE_UNIT (TREE_TYPE (etype));
break; break;
case POINTER_TYPE: case POINTER_TYPE:
n = BT_ASSUMED; 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; break;
default: default:
/* TODO: Don't do dtype for temporary descriptorless arrays. */ /* TODO: Don't do dtype for temporary descriptorless arrays. */
/* We can strange array types for temporary arrays. */ /* We can encounter strange array types for temporary arrays. */
return gfc_index_zero_node; 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 (); tmp = get_dtype_type_node ();
field = gfc_advance_chain (TYPE_FIELDS (tmp), field = gfc_advance_chain (TYPE_FIELDS (tmp),
GFC_DTYPE_ELEM_LEN); GFC_DTYPE_ELEM_LEN);

View File

@ -1,3 +1,8 @@
2018-05-13 Paul Thomas <pault@gcc.gnu.org>
PR fortran/85742
* gfortran.dg/assumed_type_9.f90 : New test.
2018-05-11 Steven G. Kargl <kargl@gcc.gnu.org> 2018-05-11 Steven G. Kargl <kargl@gcc.gnu.org>
PR fortran/85542 PR fortran/85542

View File

@ -0,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 <cesar@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