diff options
author | Thomas Koenig <tkoenig@gcc.gnu.org> | 2020-01-09 20:57:33 +0000 |
---|---|---|
committer | Thomas Koenig <tkoenig@gcc.gnu.org> | 2020-01-09 20:57:33 +0000 |
commit | d636017868e7416675bb07491eb13ff4c8536702 (patch) | |
tree | 4bea676547c2f7575236f6e24827373ffa143358 /gcc/fortran/array.c | |
parent | 2b8ce6216e197e6243052b121c696ac5a5455b85 (diff) | |
download | gcc-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.c | 18 |
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; |