Dear Fortranners, this one was really bugging me for quite some time. We failed to properly handle (= simplify) expressions using array constructors with typespec, and with parentheses and unary '+' and '-' sprinkled here and there. When there was no typespec, there was no related problem.
The underlying issue apparently was that we should simplify elements of the array constructor before attempting the type conversion. Thanks to Gerhard, who insisted by submitted many related PRs. Regtested on x86_64-pc-linux-gnu. OK for mainline? Thanks, Harald
From ee65197f4d0b0050dc61687b5a77f1afe3bd4a27 Mon Sep 17 00:00:00 2001 From: Harald Anlauf <anl...@gmx.de> Date: Wed, 12 Oct 2022 21:33:36 +0200 Subject: [PATCH] Fortran: simplify array constructors with typespec [PR93483, PR107216, PR107219] gcc/fortran/ChangeLog: PR fortran/93483 PR fortran/107216 PR fortran/107219 * array.cc (walk_array_constructor): If an element of an array constructor is an EXPR_OP, try simplification before type conversion. gcc/testsuite/ChangeLog: PR fortran/93483 PR fortran/107216 PR fortran/107219 * gfortran.dg/array_constructor_56.f90: New test. --- gcc/fortran/array.cc | 4 ++++ .../gfortran.dg/array_constructor_56.f90 | 22 +++++++++++++++++++ 2 files changed, 26 insertions(+) create mode 100644 gcc/testsuite/gfortran.dg/array_constructor_56.f90 diff --git a/gcc/fortran/array.cc b/gcc/fortran/array.cc index bbdb5b392fc..9bec299f160 100644 --- a/gcc/fortran/array.cc +++ b/gcc/fortran/array.cc @@ -1205,6 +1205,10 @@ walk_array_constructor (gfc_typespec *ts, gfc_constructor_base head) for (c = gfc_constructor_first (head); c; c = gfc_constructor_next (c)) { e = c->expr; + + if (e->expr_type == EXPR_OP) + gfc_simplify_expr (e, 0); + if (e->expr_type == EXPR_ARRAY && e->ts.type == BT_UNKNOWN && !e->ref && e->value.constructor) { diff --git a/gcc/testsuite/gfortran.dg/array_constructor_56.f90 b/gcc/testsuite/gfortran.dg/array_constructor_56.f90 new file mode 100644 index 00000000000..4701fb36225 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/array_constructor_56.f90 @@ -0,0 +1,22 @@ +! { dg-do compile } +! +! Test the fix for the following: +! PR fortran/93483 +! PR fortran/107216 +! PR fortran/107219 +! +! Contributed by G.Steinmetz + +program p + real, parameter :: r0(*) = +[real :: +(1) ] + real, parameter :: r1(*) = +[real :: +[1] ] + real, parameter :: r2(*) = -[real :: [(1)]] + real, parameter :: r3(*) = +[real :: [-(1)]] + real, parameter :: r4(*) = -[real :: [[(1)]]] + real, parameter :: r5(*) = -[real :: -[1, 2]] + real, parameter :: r6(*) = +[real :: +[1, 2]] + real, parameter :: r7(*) = [real :: 1, 2] * [real :: 1, (2)] + real, parameter :: r8(*) = [real :: 1, (2)] * [real :: 1, 2] + real, parameter :: r9(*) = +[real :: 1, 2] * [real :: 1, (2)] + real, parameter :: rr(*) = -[real :: 1, (2)] * [real :: 1, 2] +end -- 2.35.3