Patchwork Fix PR fortran/44693, take 2

login
register
mail settings
Submitter Thomas Koenig
Date July 6, 2010, 7:11 p.m.
Message ID <1278443466.4634.9.camel@linux-fd1f.site>
Download mbox | patch
Permalink /patch/58054/
State New
Headers show

Comments

Thomas Koenig - July 6, 2010, 7:11 p.m.
Hello world,

here is a correct version of a fix for PR 44693.  This contains the
necessary special case for SPREAD (where dim can be one larger than the
rank of the array), an expanded test case and a correction to an old
test case.

I think this is finally correct.

Regression-tested, no new regressions.

OK for trunk?

	Thomas

2010-07-06  Thomas Koenig  <tkoenig@gcc.gnu.org>

	PR fortran/PR44693
	* check.c (dim_rank_check):  Also check intrinsic functions.
	Adjust permissible rank for functions which reduce the rank of
	their argument.  Spread is an exception, where DIM can
	be one larger than the rank of array.

2010-07-06  Thomas Koenig  <tkoenig@gcc.gnu.org>

	PR fortran/PR44693
	* gfortran.dg/dim_range_1.f90:  New test.
	* gfortran.dg/minmaxloc_4.f90:  Remove invalid test.
Tobias Burnus - July 6, 2010, 7:43 p.m.
Thomas Koenig wrote:
> here is a correct version of a fix for PR 44693.  This contains the
> necessary special case for SPREAD (where dim can be one larger than the
> rank of the array), an expanded test case and a correction to an old
> test case.
>
> I think this is finally correct.
> Regression-tested, no new regressions.
> OK for trunk?
>   

OK. Thanks for the patch - and great that you have spotted (possibly
with the test suite) that SPREAD as only intrinsic can have "1 <= dim <=
n +1".

Tobias

> 2010-07-06  Thomas Koenig  <tkoenig@gcc.gnu.org>
>
> 	PR fortran/PR44693
> 	* check.c (dim_rank_check):  Also check intrinsic functions.
> 	Adjust permissible rank for functions which reduce the rank of
> 	their argument.  Spread is an exception, where DIM can
> 	be one larger than the rank of array.
>
> 2010-07-06  Thomas Koenig  <tkoenig@gcc.gnu.org>
>
> 	PR fortran/PR44693
> 	* gfortran.dg/dim_range_1.f90:  New test.
> 	* gfortran.dg/minmaxloc_4.f90:  Remove invalid test.
>
>
Thomas Koenig - July 6, 2010, 7:53 p.m.
Hi Tobias,

> > Regression-tested, no new regressions.
> > OK for trunk?
> >   
> 
> OK. Thanks for the patch - and great that you have spotted (possibly
> with the test suite) that SPREAD as only intrinsic can have "1 <= dim
> <=
> n +1".


Thanks for the quick review.  Committed, as rev. 161884.

As a matter of fact, I suddenly remembered not understanding this point
once in the library :-)

	Thomas

Patch

Index: testsuite/gfortran.dg/minmaxloc_4.f90
===================================================================
--- testsuite/gfortran.dg/minmaxloc_4.f90	(Revision 161784)
+++ testsuite/gfortran.dg/minmaxloc_4.f90	(Arbeitskopie)
@@ -3,7 +3,6 @@ 
 PROGRAM TST
   IMPLICIT NONE
   REAL :: A(1,3)
-  REAL :: B(3,1)
   A(:,1) = 10
   A(:,2) = 20
   A(:,3) = 30
@@ -13,9 +12,4 @@ 
   if (minloc(sum(a(:,1:3),1),1) .ne. 1) call abort()
   if (maxloc(sum(a(:,1:3),1),1) .ne. 3) call abort()
 
-  B(1,:) = 10
-  B(2,:) = 20
-  B(3,:) = 30
-  if (minloc(sum(b(1:3,:),2),2) .ne. 1) call abort()
-  if (maxloc(sum(b(1:3,:),2),2) .ne. 3) call abort()
 END PROGRAM TST
Index: fortran/check.c
===================================================================
--- fortran/check.c	(Revision 161784)
+++ fortran/check.c	(Arbeitskopie)
@@ -473,12 +473,15 @@ 
   if (dim == NULL)
     return SUCCESS;
 
-  if (dim->expr_type != EXPR_CONSTANT
-      || (array->expr_type != EXPR_VARIABLE
-	  && array->expr_type != EXPR_ARRAY))
+  if (dim->expr_type != EXPR_CONSTANT)
     return SUCCESS;
 
-  rank = array->rank;
+  if (array->expr_type == EXPR_FUNCTION && array->value.function.isym
+      && array->value.function.isym->id == GFC_ISYM_SPREAD)
+    rank = array->rank + 1;
+  else
+    rank = array->rank;
+
   if (array->expr_type == EXPR_VARIABLE)
     {
       ar = gfc_find_array_ref (array);