return false;
for (c = e->value.constructor; c; c = c->next)
- if (c->expr->expr_type != EXPR_CONSTANT)
+ if (c->expr->expr_type != EXPR_CONSTANT
+ && c->expr->expr_type != EXPR_STRUCTURE)
return false;
return true;
e->ts = source->ts;
e->rank = rank;
+ if (source->ts.type == BT_CHARACTER)
+ e->ts.cl = source->ts.cl;
+ else if (source->ts.type == BT_DERIVED)
+ e->ts.derived = source->ts.derived;
+
return e;
bad_reshape:
+2010-12-09 Paul Thomas <pault@gcc.gnu.org>
+
+ PR fortran/45081
+ * gfortran.dg/derived_array_intrinsics_1.f90: New test.
+
2010-12-02 Richard Guenther <rguenther@suse.de>
Ira Rosen <irar@il.ibm.com>
2010-04-27 Richard Guenther <rguenther@suse.de>
- Backport from mainline:
- 2010-03-19 Michael Matz <matz@suse.de>
-
+ Backport from mainline:
+ 2010-03-19 Michael Matz <matz@suse.de>
+
PR c++/43116
* g++.dg/other/pr43116.C: New testcase.
--- /dev/null
+! { dg-do compile }
+! { dg-options "-fdump-tree-original" }
+! Test the fix for PR45081 in which derived type array valued intrinsics failed
+! to simplify, which caused an ICE in trans-array.c
+!
+! Contributed by Thorsten Ohl <ohl@physik.uni-wuerzburg.de>
+!
+! Modified for GCC 4.4, which does not support (UN)PACK, TRANSPOSE or SPEAD
+! as initialization expressions.
+
+ module m
+ implicit none
+ integer :: i
+ type t
+ integer :: i
+ end type t
+ type(t), dimension(4), parameter :: t1 = [( t(i), i = 1, 4)]
+ type(t), dimension(4), parameter :: t2 = [( t(i), i = 8, 11)]
+ type(t), dimension(2,2), parameter :: a = reshape ( t1, [ 2, 2 ] )
+ type(t), dimension(2,2), parameter :: b = a !transpose (a)
+ type(t), dimension(4), parameter :: c = reshape ( b, [ 4 ] )
+ type(t), dimension(2), parameter :: d = c([2,4]) !pack ( c, [.false.,.true.,.false.,.true.])
+ type(t), dimension(4), parameter :: e = c !unpack (d, [.false.,.true.,.false.,.true.], t2)
+ type(t), dimension(4,2), parameter :: f = reshape([c,c],[4,2]) !spread (e, 2, 2)
+ type(t), dimension(8), parameter :: g = reshape ( f, [ 8 ] )
+ integer, parameter :: total = g(3)%i
+ end module m
+
+ use m
+ integer :: j
+ j = total
+ end
+! { dg-final { scan-tree-dump-times "j = 3" 1 "original" } }