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:
parent
798a67a4ce
commit
f094a21f31
@ -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.
|
||||||
|
@ -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);
|
||||||
|
@ -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
|
||||||
|
34
gcc/testsuite/gfortran.dg/assumed_type_9.f90
Normal file
34
gcc/testsuite/gfortran.dg/assumed_type_9.f90
Normal 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
|
||||||
|
|
Loading…
Reference in New Issue
Block a user