[gcc/devel/omp/gcc-9] re PR fortran/91552 (ICE with valid array constructor)

Tobias Burnus burnus@gcc.gnu.org
Thu Mar 5 14:02:00 GMT 2020


https://gcc.gnu.org/g:a1a973824613756fb97e86aae237fcaef9e176c3

commit a1a973824613756fb97e86aae237fcaef9e176c3
Author: Steven G. Kargl <kargl@gcc.gnu.org>
Date:   Mon Sep 2 17:16:05 2019 +0000

    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: r275323

Diff:
---
 gcc/fortran/ChangeLog                 |  6 ++++++
 gcc/fortran/array.c                   | 36 +++++++++++++++++++++++++++++------
 gcc/testsuite/ChangeLog               |  5 +++++
 gcc/testsuite/gfortran.dg/pr91552.f90 | 10 ++++++++++
 4 files changed, 51 insertions(+), 6 deletions(-)

diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 52fbf85..06e13e0 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -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-08-30  Steven G. Kargl  <kargl@gcc.gnu.org>
 
 	PR fortran/91587
diff --git a/gcc/fortran/array.c b/gcc/fortran/array.c
index 0aee220..bda08c7 100644
--- a/gcc/fortran/array.c
+++ b/gcc/fortran/array.c
@@ -1124,6 +1124,31 @@ match_array_cons_element (gfc_constructor_base *result)
 }
 
 
+/* 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
@@ -1253,14 +1278,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 5ae06aa..7069eec 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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  Martin Liska  <mliska@suse.cz>
 
 	Backport from mainline
diff --git a/gcc/testsuite/gfortran.dg/pr91552.f90 b/gcc/testsuite/gfortran.dg/pr91552.f90
new file mode 100644
index 0000000..bb95918
--- /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



More information about the Gcc-cvs mailing list