aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Thomas <pault@gcc.gnu.org>2018-05-13 17:01:16 +0000
committerPaul Thomas <pault@gcc.gnu.org>2018-05-13 17:01:16 +0000
commitf094a21f31a0ada105b5c8e7fe85f05c225fd3f4 (patch)
tree9da4b0c241f1ee86401dc99456230cdcccf0a722
parent798a67a4ce57b295d568a8548c0319258a805c23 (diff)
downloadgcc-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
-rw-r--r--gcc/fortran/ChangeLog10
-rw-r--r--gcc/fortran/trans-types.c14
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/assumed_type_9.f9034
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
+