Patchwork [fortran] PR47850 - [4.6 Regression] ICE in gfc_conv_array_initializer

login
register
mail settings
Submitter Paul Richard Thomas
Date March 6, 2011, 6:57 p.m.
Message ID <AANLkTim=zqE49V_zs8i4mm7krzeebP49VywJ7WeLS7QV@mail.gmail.com>
Download mbox | patch
Permalink /patch/85587/
State New
Headers show

Comments

Paul Richard Thomas - March 6, 2011, 6:57 p.m.
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.
Jerry DeLisle - March 6, 2011, 7:22 p.m.
On 03/06/2011 10:57 AM, Paul Richard Thomas wrote:
> 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?
>

AOK, what a bugger. I spent several hours trying to isolate where one could 
effect a change.

Thanks Paul for "seeing" it.

Jerry
Paul Richard Thomas - March 6, 2011, 8:19 p.m.
Dear Jerry,

I am not sure about one of the submitters reviewing the patch :-)
Fortunately, Dominique d'Humieres ran it by his own tests and found
that it did not break anything.

Submitted as revision 170720.

Thanks to you both!

Paul

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.

Patch

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