]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR fortran/45081 (ICE in gfc_conv_array_initializer, at fortran/trans-array.c...
authorTobias Burnus <burnus@gcc.gnu.org>
Thu, 9 Dec 2010 13:30:59 +0000 (14:30 +0100)
committerTobias Burnus <burnus@gcc.gnu.org>
Thu, 9 Dec 2010 13:30:59 +0000 (14:30 +0100)
2010-12-09  Paul Thomas  <pault@gcc.gnu.org>

        PR fortran/45081
        * simplify.c (is_constant_array_expr): Allow structure array
        elements as well as constants.
        (gfc_simplify_reshape): Copy the derived type of source to
        the result.

2010-12-09  Paul Thomas  <pault@gcc.gnu.org>

        PR fortran/45081
        * gfortran.dg/derived_array_intrinsics_1.f90 : New test.

From-SVN: r167637

gcc/fortran/ChangeLog
gcc/fortran/simplify.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/derived_array_intrinisics_1.f90 [new file with mode: 0644]

index 8d20a58dd5ec7f469a6104a7509ee082815e5d07..4e1f70bae2275e2945ad16647c1da29f2190e139 100644 (file)
@@ -1,3 +1,11 @@
+2010-12-09  Paul Thomas  <pault@gcc.gnu.org>
+
+       PR fortran/45081
+       * simplify.c (is_constant_array_expr): Allow structure array
+       elements as well as constants.
+       (gfc_simplify_reshape): Copy the derived type of source to
+       the result.
+
 2010-05-22  Release Manager
 
        * GCC 4.3.5 released.
index ac43b392415b490c1f823a4bf9fc2fa8bf68ecf4..40b3aec15a54966dc1c4fc5ce1c0cf50f25740cf 100644 (file)
@@ -3257,7 +3257,8 @@ is_constant_array_expr (gfc_expr *e)
     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;
@@ -3486,6 +3487,11 @@ inc:
   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:
index 0c7afc6cc8b5e08681828176da5c1ba43be97c78..4f35e3d72c91ee2419dbc0564d447e95c98c4140 100644 (file)
@@ -1,3 +1,8 @@
+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>
 
@@ -61,9 +66,9 @@
 
 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.
 
diff --git a/gcc/testsuite/gfortran.dg/derived_array_intrinisics_1.f90 b/gcc/testsuite/gfortran.dg/derived_array_intrinisics_1.f90
new file mode 100644 (file)
index 0000000..7d8bbce
--- /dev/null
@@ -0,0 +1,33 @@
+! { 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" } }