Dear Fortranners,

after lengthy debugging of this PR it became obvious that we killed
the typespec while trying to expand an empty array constructor.

Bad idea, but easy to fix.

Regtested on x86_64-pc-linux-gnu.  OK for mainline and 11-branch?

Thanks,
Harald

From b9be44b422063c6c1f7a4bb50245ba4051e76136 Mon Sep 17 00:00:00 2001
From: Harald Anlauf <anl...@gmx.de>
Date: Mon, 17 Jan 2022 22:52:08 +0100
Subject: [PATCH] Fortran: handle expansion of zero-sized array constructors

gcc/fortran/ChangeLog:

	PR fortran/103692
	* array.c (gfc_expand_constructor): Handle zero-sized array
	constructors.

gcc/testsuite/ChangeLog:

	PR fortran/103692
	* gfortran.dg/pr102520.f90: Adjust error messages.
	* gfortran.dg/pr103692.f90: New test.
---
 gcc/fortran/array.c                    |  3 +++
 gcc/testsuite/gfortran.dg/pr102520.f90 |  6 ++----
 gcc/testsuite/gfortran.dg/pr103692.f90 | 23 +++++++++++++++++++++++
 3 files changed, 28 insertions(+), 4 deletions(-)
 create mode 100644 gcc/testsuite/gfortran.dg/pr103692.f90

diff --git a/gcc/fortran/array.c b/gcc/fortran/array.c
index 472304326e8..f1d92e00c98 100644
--- a/gcc/fortran/array.c
+++ b/gcc/fortran/array.c
@@ -1883,6 +1883,9 @@ gfc_expand_constructor (gfc_expr *e, bool fatal)
   gfc_expr *f;
   bool rc;

+  if (gfc_is_size_zero_array (e))
+    return true;
+
   /* If we can successfully get an array element at the max array size then
      the array is too big to expand, so we just return.  */
   f = gfc_get_array_element (e, flag_max_array_constructor);
diff --git a/gcc/testsuite/gfortran.dg/pr102520.f90 b/gcc/testsuite/gfortran.dg/pr102520.f90
index 1c98c185c17..d2ea8f3a424 100644
--- a/gcc/testsuite/gfortran.dg/pr102520.f90
+++ b/gcc/testsuite/gfortran.dg/pr102520.f90
@@ -5,8 +5,6 @@ program p
   type t
   end type
   type(t), parameter :: a(4)   = shape(1)         ! { dg-error "Incompatible" }
-  type(t), parameter :: b(2,2) = reshape(a,[2,2]) ! { dg-error "Incompatible" }
-  type(t), parameter :: c(2,2) = transpose(b)     ! { dg-error "Unclassifiable" }
+  type(t), parameter :: b(2,2) = reshape(a,[2,2]) ! { dg-error "must be an array" }
+  type(t), parameter :: c(2,2) = transpose(b)     ! { dg-error "must be of rank 2" }
 end
-
-! { dg-error "Different shape for array assignment" " " { target *-*-* } 7 }
diff --git a/gcc/testsuite/gfortran.dg/pr103692.f90 b/gcc/testsuite/gfortran.dg/pr103692.f90
new file mode 100644
index 00000000000..9687a3cec9d
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr103692.f90
@@ -0,0 +1,23 @@
+! { dg-do compile }
+! { dg-options "-fdump-tree-original" }
+! PR fortran/103692 - ICE in expand_constructor
+! Contributed by G.Steinmetz
+
+program p
+  character(3), parameter :: a(4) = 'abc'
+  character(*), parameter :: b(*) =  (a(2:1))
+  character(*), parameter :: y(*) = [(a(2:1))]
+  character(*), parameter :: u(*) =  a(2:1)
+  character(*), parameter :: v(*) = [a(2:1)]
+  character(*), parameter :: w(-1) = (a(2:1))
+  character(*), parameter :: x(-1) =  a(2:1)
+  character(5), parameter :: c(3,3) = 'def'
+  character(*), parameter :: d(*)   = [(c(2:1,2:))]
+  character(*), parameter :: e(*,*) =  (c(2:1,2:))
+  if (len(b) /= 3 .or. size (b) /= 0) stop 1
+  if (len(y) /= 3 .or. size (y) /= 0) stop 2
+  if (len(d) /= 5 .or. size (d) /= 0) stop 3
+  if (len(e) /= 5 .or. any (shape (e) /= [0,2])) stop 4
+end
+
+! { dg-final { scan-tree-dump-not "_gfortran_stop_numeric" "original" } }
--
2.31.1

Reply via email to