aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/array.c
diff options
context:
space:
mode:
authorThomas Koenig <tkoenig@gcc.gnu.org>2020-01-09 20:57:33 +0000
committerThomas Koenig <tkoenig@gcc.gnu.org>2020-01-09 20:57:33 +0000
commitd636017868e7416675bb07491eb13ff4c8536702 (patch)
tree4bea676547c2f7575236f6e24827373ffa143358 /gcc/fortran/array.c
parent2b8ce6216e197e6243052b121c696ac5a5455b85 (diff)
downloadgcc-d636017868e7416675bb07491eb13ff4c8536702.zip
gcc-d636017868e7416675bb07491eb13ff4c8536702.tar.gz
gcc-d636017868e7416675bb07491eb13ff4c8536702.tar.bz2
Save typespec for empty array constructor.
2020-01-09 Thomas Koenig <tkoenig@gcc.gnu.org> PR fortran/65428 * array.c (empty_constructor): New variable. (empty_ts): New variable. (expand_constructor): Save typespec in empty_ts. Unset empty_constructor if there is an element. (gfc_expand_constructor): Initialize empty_constructor and empty_ts. If there was no explicit constructor type and the constructor is empty, take the type from empty_ts. 2020-01-09 Thomas Koenig <tkoenig@gcc.gnu.org> PR fortran/65428 * gfortran.dg/zero_sized_11.f90: New test. From-SVN: r280063
Diffstat (limited to 'gcc/fortran/array.c')
-rw-r--r--gcc/fortran/array.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/gcc/fortran/array.c b/gcc/fortran/array.c
index 157acb8..c873cf2 100644
--- a/gcc/fortran/array.c
+++ b/gcc/fortran/array.c
@@ -1759,6 +1759,11 @@ cleanup:
return t;
}
+/* Variables for noticing if all constructors are empty, and
+ if any of them had a type. */
+
+static bool empty_constructor;
+static gfc_typespec empty_ts;
/* Expand a constructor into constant constructors without any
iterators, calling the work function for each of the expanded
@@ -1782,6 +1787,9 @@ expand_constructor (gfc_constructor_base base)
e = c->expr;
+ if (empty_constructor)
+ empty_ts = e->ts;
+
if (e->expr_type == EXPR_ARRAY)
{
if (!expand_constructor (e->value.constructor))
@@ -1790,6 +1798,7 @@ expand_constructor (gfc_constructor_base base)
continue;
}
+ empty_constructor = false;
e = gfc_copy_expr (e);
if (!gfc_simplify_expr (e, 1))
{
@@ -1873,6 +1882,8 @@ gfc_expand_constructor (gfc_expr *e, bool fatal)
iter_stack = NULL;
+ empty_constructor = true;
+ gfc_clear_ts (&empty_ts);
current_expand.expand_work_function = expand;
if (!expand_constructor (e->value.constructor))
@@ -1882,6 +1893,13 @@ gfc_expand_constructor (gfc_expr *e, bool fatal)
goto done;
}
+ /* If we don't have an explicit constructor type, and there
+ were only empty constructors, then take the type from
+ them. */
+
+ if (constructor_ts.type == BT_UNKNOWN && empty_constructor)
+ e->ts = empty_ts;
+
gfc_constructor_free (e->value.constructor);
e->value.constructor = current_expand.base;