PR fortran/103692 - [11/12 Regression] ICE in add_init_expr_to_sym, at fortran/decl.c:2062
Commit Message
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
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
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