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
@@ -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);
@@ -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 }
new file mode 100644
@@ -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