re PR fortran/47850 (ICE in gfc_conv_array_initializer)
authorPaul Thomas <pault@gcc.gnu.org>
Sun, 6 Mar 2011 20:15:38 +0000 (20:15 +0000)
committerPaul Thomas <pault@gcc.gnu.org>
Sun, 6 Mar 2011 20:15:38 +0000 (20:15 +0000)
2011-03-06  Paul Thomas  <pault@gcc.gnu.org>
    Jerry DeLisle  <jvdelisle@gcc.gnu.org>

PR fortran/47850
* expr.c (gfc_is_constant_expr): Only use gfc_constant_ac if
the expression has an iterator.  Otherwise, iterate through the
array, checking for constant expressions for each element.

2011-03-06  Paul Thomas  <pault@gcc.gnu.org>
    Jerry DeLisle  <jvdelisle@gcc.gnu.org>

PR fortran/47850
* gfortran.dg/array_constructor_37.f90 : New test.

Co-Authored-By: Jerry DeLisle <jvdelisle@gcc.gnu.org>
From-SVN: r170720

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

index 188a193568e7d2b9662fa2b87adb51d2896656ea..a479ef6721010788eadf9ee6d83bd3abf3cf69cb 100644 (file)
@@ -1,3 +1,11 @@
+2011-03-06  Paul Thomas  <pault@gcc.gnu.org>
+           Jerry DeLisle  <jvdelisle@gcc.gnu.org>
+
+       PR fortran/47850
+       * expr.c (gfc_is_constant_expr): Only use gfc_constant_ac if
+       the expression has an iterator.  Otherwise, iterate through the
+       array, checking for constant expressions for each element.
+
 2011-03-04  Janne Blomqvist  <jb@gcc.gnu.org>
 
        PR libfortran/47802
index b30bc64d74ad6a63ef89dc8aabe2789ec9eab303..58b6036094a6268dae17ee00fca489913629b49d 100644 (file)
@@ -937,16 +937,18 @@ gfc_is_constant_expr (gfc_expr *e)
       return e->ref == NULL || (gfc_is_constant_expr (e->ref->u.ss.start)
                                && gfc_is_constant_expr (e->ref->u.ss.end));
 
+    case EXPR_ARRAY:
     case EXPR_STRUCTURE:
-      for (c = gfc_constructor_first (e->value.constructor);
-          c; c = gfc_constructor_next (c))
+      c = gfc_constructor_first (e->value.constructor);
+      if ((e->expr_type == EXPR_ARRAY) && c && c->iterator)
+        return gfc_constant_ac (e);
+
+      for (; c; c = gfc_constructor_next (c))
        if (!gfc_is_constant_expr (c->expr))
          return 0;
 
       return 1;
 
-    case EXPR_ARRAY:
-      return gfc_constant_ac (e);
 
     default:
       gfc_internal_error ("gfc_is_constant_expr(): Unknown expression type");
index 7a5cc2cb5ab349d60009ba712ff62b53d1dfb025..60d0fae49f302231db7d8ad943eddb89a9a26efc 100644 (file)
@@ -1,3 +1,9 @@
+2011-03-06  Paul Thomas  <pault@gcc.gnu.org>
+           Jerry DeLisle  <jvdelisle@gcc.gnu.org>
+
+       PR fortran/47850
+       * gfortran.dg/array_constructor_37.f90 : New test.
+
 2011-03-05  Jason Merrill  <jason@redhat.com>
 
        * g++.dg/abi/mangle39.C: ABI v5, not 6.
diff --git a/gcc/testsuite/gfortran.dg/array_constructor_37.f90 b/gcc/testsuite/gfortran.dg/array_constructor_37.f90
new file mode 100644 (file)
index 0000000..5c66cce
--- /dev/null
@@ -0,0 +1,32 @@
+! { dg-do compile }
+! Check the fix for PR47850, in which the argument of ANY, below, was not
+! simplified, thereby causing an ICE.
+!
+! Contributed by Tobias Burnus  <burnus@gcc.gnu.org> but based on James van Buskirk's program in
+! http://groups.google.com/group/comp.lang.fortran/browse_thread/thread/625faf82578e9af8
+!
+!
+program Cindex
+   implicit none
+   integer,parameter :: SENSOR_CHANNEL(8) = &
+      [10,12,17,20,22,30,33,34]
+   integer,parameter :: NLTE_CHANNEL(3) = [20,22,34]
+   integer,parameter :: N_NLTE_CHANNELS = size(NLTE_CHANNEL)
+   integer,parameter :: N_CHANNELS = size(SENSOR_CHANNEL)
+   integer i
+   integer,parameter :: C_INDEX(8) = unpack( &
+      vector = [(i,i=1,size(SENSOR_CHANNEL))], &
+      mask = [(any(SENSOR_CHANNEL(i) == NLTE_CHANNEL), &
+         i=lbound(SENSOR_CHANNEL,1),ubound(SENSOR_CHANNEL,1))], &
+      field = 0)
+   character(20) fmt
+
+   write(fmt,'(a,i0,a)') '(a,t19,',size(SENSOR_CHANNEL),'(i3:","))'
+   write(*,fmt) 'SENSOR_CHANNEL = ',SENSOR_CHANNEL
+   write(fmt,'(a,i0,a)') '(a,t19,',size(NLTE_CHANNEL),'(i3:","))'
+   write(*,fmt) 'NLTE_CHANNEL = ',NLTE_CHANNEL
+   write(*,'(a,t19,i3)') 'N_NLTE_CHANNELS = ',N_NLTE_CHANNELS
+   write(*,'(a,t19,i3)') 'N_CHANNELS = ',N_CHANNELS
+   write(fmt,'(a,i0,a)') '(a,t19,',size(C_INDEX),'(i3:","))'
+   write(*,fmt) 'C_INDEX = ',C_INDEX
+end program Cindex