diff mbox

Fix PR fortran/44693, take 2

Message ID 1278443466.4634.9.camel@linux-fd1f.site
State New
Headers show

Commit Message

Thomas Koenig July 6, 2010, 7:11 p.m. UTC
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.

Comments

Tobias Burnus July 6, 2010, 7:43 p.m. UTC | #1
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. UTC | #2
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
diff mbox

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);