diff mbox series

PR fortran/103692 - [11/12 Regression] ICE in add_init_expr_to_sym, at fortran/decl.c:2062

Message ID trinity-260acd42-8bd7-4d00-8e16-6ab6d150e3f1-1642456717168@3c-app-gmx-bap32
State New
Headers show
Series PR fortran/103692 - [11/12 Regression] ICE in add_init_expr_to_sym, at fortran/decl.c:2062 | expand

Commit Message

Harald Anlauf Jan. 17, 2022, 9:58 p.m. UTC
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

Comments

Thomas Koenig Jan. 17, 2022, 10:24 p.m. UTC | #1
Hi Harald,

> 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?

OK.

Thanks for the patch!

Best regards

	Thomas
diff mbox series

Patch

From b9be44b422063c6c1f7a4bb50245ba4051e76136 Mon Sep 17 00:00:00 2001
From: Harald Anlauf <anlauf@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