diff options
author | Paul Thomas <pault@gcc.gnu.org> | 2018-05-13 17:01:16 +0000 |
---|---|---|
committer | Paul Thomas <pault@gcc.gnu.org> | 2018-05-13 17:01:16 +0000 |
commit | f094a21f31a0ada105b5c8e7fe85f05c225fd3f4 (patch) | |
tree | 9da4b0c241f1ee86401dc99456230cdcccf0a722 /gcc | |
parent | 798a67a4ce57b295d568a8548c0319258a805c23 (diff) | |
download | gcc-f094a21f31a0ada105b5c8e7fe85f05c225fd3f4.zip gcc-f094a21f31a0ada105b5c8e7fe85f05c225fd3f4.tar.gz gcc-f094a21f31a0ada105b5c8e7fe85f05c225fd3f4.tar.bz2 |
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/fortran/ChangeLog | 10 | ||||
-rw-r--r-- | gcc/fortran/trans-types.c | 14 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/assumed_type_9.f90 | 34 |
4 files changed, 57 insertions, 6 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 72bbda3..a00e861 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -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> * gfortran.h: Remove prototype. @@ -7,7 +15,7 @@ PR fortran/85542 * expr.c (check_inquiry): Avoid NULL pointer dereference. - + 2018-05-10 Steven G. Kargl <kargl@gcc.gnu.org> PR fortran/85687 diff --git a/gcc/fortran/trans-types.c b/gcc/fortran/trans-types.c index 7ff27a3..f50eb0a 100644 --- a/gcc/fortran/trans-types.c +++ b/gcc/fortran/trans-types.c @@ -1518,6 +1518,8 @@ gfc_get_dtype_rank_type (int rank, tree etype) tree field; vec<constructor_elt, va_gc> *v = NULL; + size = TYPE_SIZE_UNIT (etype); + switch (TREE_CODE (etype)) { case INTEGER_TYPE: @@ -1546,22 +1548,24 @@ gfc_get_dtype_rank_type (int rank, tree etype) /* 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 strange array types for temporary arrays. */ + /* We can encounter 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); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index ddcba1f..657390c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -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> PR fortran/85542 diff --git a/gcc/testsuite/gfortran.dg/assumed_type_9.f90 b/gcc/testsuite/gfortran.dg/assumed_type_9.f90 new file mode 100644 index 0000000..c4a93fe --- /dev/null +++ b/gcc/testsuite/gfortran.dg/assumed_type_9.f90 @@ -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 + |