From: Steven G. Kargl Date: Mon, 2 Sep 2019 16:46:54 +0000 (+0000) Subject: re PR fortran/91552 (ICE with valid array constructor) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=be0fb5484a64414878c31a1606b07175b54ecb90;p=gcc.git re PR fortran/91552 (ICE with valid array constructor) 2019-09-02 Steven G. Kargl PR fortran/91552 * array.c (walk_array_constructor): New function. (gfc_match_array_constructor): Use it. 2019-09-02 Steven G. Kargl PR fortran/91552 * gfortran.dg/pr91552.f90: New test. From-SVN: r275322 --- diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 0ed86cee170..b0dfb0e7da4 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,9 @@ +2019-09-02 Steven G. Kargl + + PR fortran/91552 + * array.c (walk_array_constructor): New function. + (gfc_match_array_constructor): Use it. + 2019-09-01 Paul Thomas * array.c (spec_dimen_size): Check for the presence of diff --git a/gcc/fortran/array.c b/gcc/fortran/array.c index b972abe8a38..ba8a81655ed 100644 --- a/gcc/fortran/array.c +++ b/gcc/fortran/array.c @@ -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 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a7c473efc40..c2608ce8db4 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2019-09-02 Steven G. Kargl + + PR fortran/91552 + * gfortran.dg/pr91552.f90: New test. + 2019-09-02 Bernd Edlinger PR middle-end/91605 diff --git a/gcc/testsuite/gfortran.dg/pr91552.f90 b/gcc/testsuite/gfortran.dg/pr91552.f90 new file mode 100644 index 00000000000..bb959185cf9 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr91552.f90 @@ -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