This is the mail archive of the fortran@gcc.gnu.org mailing list for the GNU Fortran project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Patch, fortran] PR47850 - [4.6 Regression] ICE in gfc_conv_array_initializer


This one was exceedingly difficult to diagnose.  The workings of
array.c are opaque to say the least of it!  However, the fix is
relatively clear.  The testcase in the PR failed because the argument
of ANY is not a gfc_constant_ac.  However, iterating through the
constructor and testing the expressions for constantness yields the
correct result.

Bootstraps and regtests on FC9/x86_64 - OK for trunk?

Cheers

Paul and Jerry

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.
Index: gcc/fortran/expr.c
===================================================================
*** gcc/fortran/expr.c	(revision 170715)
--- gcc/fortran/expr.c	(working copy)
*************** gfc_is_constant_expr (gfc_expr *e)
*** 937,952 ****
        return e->ref == NULL || (gfc_is_constant_expr (e->ref->u.ss.start)
  				&& gfc_is_constant_expr (e->ref->u.ss.end));
  
      case EXPR_STRUCTURE:
!       for (c = gfc_constructor_first (e->value.constructor);
! 	   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");
--- 937,954 ----
        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:
!       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;
  
  
      default:
        gfc_internal_error ("gfc_is_constant_expr(): Unknown expression type");
Index: gcc/testsuite/gfortran.dg/array_constructor_37.f90
===================================================================
*** gcc/testsuite/gfortran.dg/array_constructor_37.f90	(revision 0)
--- gcc/testsuite/gfortran.dg/array_constructor_37.f90	(revision 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

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]