re PR fortran/91552 (ICE with valid array constructor)

2019-09-02  Steven G. Kargl  <kargl@gc.gnu.org>

	PR fortran/91552
	* array.c (walk_array_constructor): New function.
	(gfc_match_array_constructor): Use it.

2019-09-02  Steven G. Kargl  <kargl@gc.gnu.org>

	PR fortran/91552
	* gfortran.dg/pr91552.f90: New test.

From-SVN: r275322
This commit is contained in:
Steven G. Kargl 2019-09-02 16:46:54 +00:00
parent b82c2e6fce
commit be0fb5484a
4 changed files with 51 additions and 6 deletions

View file

@ -1,3 +1,9 @@
2019-09-02 Steven G. Kargl <kargl@gc.gnu.org>
PR fortran/91552
* array.c (walk_array_constructor): New function.
(gfc_match_array_constructor): Use it.
2019-09-01 Paul Thomas <pault@gcc.gnu.org>
* array.c (spec_dimen_size): Check for the presence of

View file

@ -1134,6 +1134,31 @@ done:
}
/* Convert components of an array constructor to the type in ts. */
static match
walk_array_constructor (gfc_typespec *ts, gfc_constructor_base head)
{
gfc_constructor *c;
gfc_expr *e;
match m;
for (c = gfc_constructor_first (head); c; c = gfc_constructor_next (c))
{
e = c->expr;
if (e->expr_type == EXPR_ARRAY && e->ts.type == BT_UNKNOWN
&& !e->ref && e->value.constructor)
{
m = walk_array_constructor (ts, e->value.constructor);
if (m == MATCH_ERROR)
return m;
}
else if (!gfc_convert_type (e, ts, 1) && e->ts.type != BT_UNKNOWN)
return MATCH_ERROR;
}
return MATCH_YES;
}
/* Match an array constructor. */
match
@ -1263,14 +1288,13 @@ done:
}
}
/* Walk the constructor and ensure type conversion for numeric types. */
/* Walk the constructor, and if possible, do type conversion for
numeric types. */
if (gfc_numeric_ts (&ts))
{
c = gfc_constructor_first (head);
for (; c; c = gfc_constructor_next (c))
if (!gfc_convert_type (c->expr, &ts, 1)
&& c->expr->ts.type != BT_UNKNOWN)
return MATCH_ERROR;
m = walk_array_constructor (&ts, head);
if (m == MATCH_ERROR)
return m;
}
}
else

View file

@ -1,3 +1,8 @@
2019-09-02 Steven G. Kargl <kargl@gc.gnu.org>
PR fortran/91552
* gfortran.dg/pr91552.f90: New test.
2019-09-02 Bernd Edlinger <bernd.edlinger@hotmail.de>
PR middle-end/91605

View file

@ -0,0 +1,10 @@
! { dg-do run }
! PR fortran/91552
! Code contributed by Gerhard Steinmetz.
program p
real :: y(3), z(4)
y = 2.0 * [real :: 1, [2], 3]
z = 2.0 * [real :: 1, [2, [4]], 3]
if (any(y /= [2., 4., 6.])) stop 1
if (any(z /= [2., 4., 8., 6.])) stop 2
end