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] PR34945 - LBOUND fails for array with KIND(complex) used in zero-sized dimension


:ADDPATCH fortran:

This is one of the four remaining "F95" bugs.  Again, the problem is
due to jumping the gun and trying to do checks before expressions are
resolved.  Here, the check for negative array size was moved from
matching to resolution, so that we can be sure that every expression
that can be simplified has had it done.

Bootstraps and regtests on x86_ia64 - OK for 4.4 when it opens?

Cheers

Paul

2008-02-03  Paul Thomas  <pault@gcc.gnu.org>

	PR fortran/34945
	* array.c (match_array_element_spec): Remove check for negative
	array size.
	(gfc_resolve_array_spec): Add check for negative size.

2008-02-03  Paul Thomas  <pault@gcc.gnu.org>

	PR fortran/34945
	* gfortran.dg/bounds_check_13.f: New test.
Index: gcc/fortran/array.c
===================================================================
*** gcc/fortran/array.c	(revision 132077)
--- gcc/fortran/array.c	(working copy)
*************** gfc_resolve_array_spec (gfc_array_spec *
*** 250,255 ****
--- 250,270 ----
        e = as->upper[i];
        if (resolve_array_bound (e, check_constant) == FAILURE)
  	return FAILURE;
+ 
+       if ((as->lower[i] == NULL) || (as->upper[i] == NULL))
+ 	continue;
+ 
+       /* If the size is negative in this dimension, set it to zero.  */
+       if (as->lower[i]->expr_type == EXPR_CONSTANT
+ 	    && as->upper[i]->expr_type == EXPR_CONSTANT
+ 	    && mpz_cmp (as->upper[i]->value.integer,
+ 			as->lower[i]->value.integer) < 0)
+ 	{
+ 	  gfc_free_expr (as->upper[i]);
+ 	  as->upper[i] = gfc_copy_expr (as->lower[i]);
+ 	  mpz_sub_ui (as->upper[i]->value.integer,
+ 		      as->upper[i]->value.integer, 1);
+ 	}
      }
  
    return SUCCESS;
*************** match_array_element_spec (gfc_array_spec
*** 318,332 ****
    if (m == MATCH_NO)
      return AS_ASSUMED_SHAPE;
  
-   /* If the size is negative in this dimension, set it to zero.  */
-   if ((*lower)->expr_type == EXPR_CONSTANT
-       && (*upper)->expr_type == EXPR_CONSTANT
-       && mpz_cmp ((*upper)->value.integer, (*lower)->value.integer) < 0)
-     {
-       gfc_free_expr (*upper);
-       *upper = gfc_copy_expr (*lower);
-       mpz_sub_ui ((*upper)->value.integer, (*upper)->value.integer, 1);
-     }
    return AS_EXPLICIT;
  }
  
--- 333,338 ----
Index: gcc/testsuite/gfortran.dg/bounds_check_13.f
===================================================================
*** gcc/testsuite/gfortran.dg/bounds_check_13.f	(revision 0)
--- gcc/testsuite/gfortran.dg/bounds_check_13.f	(revision 0)
***************
*** 0 ****
--- 1,21 ----
+ ! { dg-do compile }
+ ! Tests the fix for PR34945, in which the lbound = KIND(YDA) was not resolved
+ ! in time to set the size of TEST_ARRAY to zero.
+ !
+ ! Contributed by Dick Hendrickson <dick.hendrickson@gmail.com>
+ !
+       SUBROUTINE VF0009(IDA1,IDA2,YDA,HDA)
+       INTEGER(4) IDA1(4)
+       INTEGER(4) IDA2(4)
+       COMPLEX(8) YDA(2)
+       INTEGER(4) HDA(3)
+ !  I N I T I A L I Z A T I O N  S E C T I O N
+       COMPLEX(KIND=4) :: TEST_ARRAY
+      $(  4:5,
+      $   KIND(YDA):5,
+      $   4:5,
+      $   4:5  )
+ !  T E S T  S T A T E M E N T S
+        IDA1(1:4) = LBOUND(TEST_ARRAY)
+       END SUBROUTINE
+ 

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