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:
parent
b82c2e6fce
commit
be0fb5484a
4 changed files with 51 additions and 6 deletions
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
10
gcc/testsuite/gfortran.dg/pr91552.f90
Normal file
10
gcc/testsuite/gfortran.dg/pr91552.f90
Normal 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
|
Loading…
Add table
Reference in a new issue