re PR fortran/91552 (ICE with valid array constructor)
authorSteven G. Kargl <kargl@gcc.gnu.org>
Mon, 2 Sep 2019 16:46:54 +0000 (16:46 +0000)
committerSteven G. Kargl <kargl@gcc.gnu.org>
Mon, 2 Sep 2019 16:46:54 +0000 (16:46 +0000)
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

gcc/fortran/ChangeLog
gcc/fortran/array.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/pr91552.f90 [new file with mode: 0644]

index 0ed86cee170048a6d28994b63194b52a13181545..b0dfb0e7da42dbef06f6be573af436031b007b35 100644 (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
index b972abe8a38bc13698a194ae38eefbb73504f555..ba8a81655ed5b077c68c99e4eb191a5532e50332 100644 (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
index a7c473efc4058d2b6271c732cd21d90323673a97..c2608ce8db4fef65ee31e37bb3a83a340a652c6e 100644 (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
diff --git a/gcc/testsuite/gfortran.dg/pr91552.f90 b/gcc/testsuite/gfortran.dg/pr91552.f90
new file mode 100644 (file)
index 0000000..bb95918
--- /dev/null
@@ -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