Patchwork [Fortran] PR 54225 - Fix ice-on-invalid-code with "*" in array refs

login
register
mail settings
Submitter Tobias Burnus
Date Sept. 11, 2012, 5:54 a.m.
Message ID <504ED20F.30209@net-b.de>
Download mbox | patch
Permalink /patch/183006/
State New
Headers show

Comments

Tobias Burnus - Sept. 11, 2012, 5:54 a.m.
This patch fixes a GCC 4.7/4.8 regression for invalid code.

Build and regtested on x86-64-linux.
OK for the trunk and 4.7?

Tobias
Mikael Morin - Sept. 12, 2012, 9:46 a.m.
On 11/09/2012 07:54, Tobias Burnus wrote:
> This patch fixes a GCC 4.7/4.8 regression for invalid code.
> 
> Build and regtested on x86-64-linux.
> OK for the trunk and 4.7?
> 

Yes.
PR 53306 is also fixed by your patch according to Dominique, so don't
forget to include its testcase and to add the PR reference in the
ChangeLogs.
Thanks

Mikael

Patch

2012-09-11  Tobias Burnus  <burnus@net-b.de>

	PR fortran/54225
	* array.c (match_subscript, gfc_match_array_ref): Fix
	diagnostic of coarray's '*'.

2012-09-11  Tobias Burnus  <burnus@net-b.de>

	PR fortran/54225
	* gfortran.dg/coarray_10.f90: Update dg-error.
	* gfortran.dg/coarray_28.f90: New.
	* gfortran.dg/array_section_3.f90: New.

diff --git a/gcc/fortran/array.c b/gcc/fortran/array.c
index 07fecd8..44ec72e 100644
--- a/gcc/fortran/array.c
+++ b/gcc/fortran/array.c
@@ -91,9 +91,7 @@  match_subscript (gfc_array_ref *ar, int init, bool match_star)
   else if (!star)
     m = gfc_match_expr (&ar->start[i]);
 
-  if (m == MATCH_NO && gfc_match_char ('*') == MATCH_YES)
-    return MATCH_NO;
-  else if (m == MATCH_NO)
+  if (m == MATCH_NO)
     gfc_error ("Expected array subscript at %C");
   if (m != MATCH_YES)
     return MATCH_ERROR;
@@ -224,7 +222,7 @@  coarray:
 
   for (ar->codimen = 0; ar->codimen + ar->dimen < GFC_MAX_DIMENSIONS; ar->codimen++)
     {
-      m = match_subscript (ar, init, ar->codimen == (corank - 1));
+      m = match_subscript (ar, init, true);
       if (m == MATCH_ERROR)
 	return MATCH_ERROR;
 
@@ -255,6 +253,13 @@  coarray:
 	    gfc_error ("Invalid form of coarray reference at %C");
 	  return MATCH_ERROR;
 	}
+      else if (ar->dimen_type[ar->codimen + ar->dimen] == DIMEN_STAR)
+	{
+	  gfc_error ("Unexpected '*' for codimension %d of %d at %C",
+		     ar->codimen + 1, corank);
+	  return MATCH_ERROR;
+	}
+
       if (ar->codimen >= corank)
 	{
 	  gfc_error ("Invalid codimension %d at %C, only %d codimensions exist",
diff --git a/gcc/testsuite/gfortran.dg/coarray_10.f90 b/gcc/testsuite/gfortran.dg/coarray_10.f90
index 99f5782..78abb5a 100644
--- a/gcc/testsuite/gfortran.dg/coarray_10.f90
+++ b/gcc/testsuite/gfortran.dg/coarray_10.f90
@@ -30,12 +30,12 @@  end subroutine this_image_check
 subroutine rank_mismatch()
   implicit none
   integer,allocatable :: A(:)[:,:,:,:]
-  allocate(A(1)[1,1,1:*])     ! { dg-error "Unexpected ... for codimension" }
+  allocate(A(1)[1,1,1:*])     ! { dg-error "Too few codimensions" }
   allocate(A(1)[1,1,1,1,1,*]) ! { dg-error "Invalid codimension 5" }
   allocate(A(1)[1,1,1,*])
   allocate(A(1)[1,1])     ! { dg-error "Too few codimensions" }
   allocate(A(1)[1,*])     ! { dg-error "Too few codimensions" }
-  allocate(A(1)[1,1:*])   ! { dg-error "Unexpected ... for codimension" }
+  allocate(A(1)[1,1:*])   ! { dg-error "Too few codimensions" }
 
   A(1)[1,1,1] = 1       ! { dg-error "Too few codimensions" }
   A(1)[1,1,1,1,1,1] = 1 ! { dg-error "Invalid codimension 5" }
@@ -48,5 +48,5 @@  end subroutine rank_mismatch
 subroutine rank_mismatch2()
   implicit none
   integer, allocatable:: A(:)[:,:,:]
-  allocate(A(1)[7:8,4:*]) ! { dg-error "Unexpected .*. for codimension 2 of 3" }
+  allocate(A(1)[7:8,4:*]) ! { dg-error "Too few codimensions" }
 end subroutine rank_mismatch2
--- /dev/null	2012-09-11 07:30:33.339725680 +0200
+++ gcc/gcc/testsuite/gfortran.dg/array_section_3.f90	2012-09-10 18:29:37.000000000 +0200
@@ -0,0 +1,12 @@ 
+! { dg-do compile }
+!
+! PR fortran/54225
+!
+! Contributed by robb wu
+!
+program test
+  implicit none
+  real :: A(2,3)
+
+  print *, A(1, *)  ! { dg-error 'Expected array subscript' }
+end program
--- /dev/null	2012-09-11 07:30:33.339725680 +0200
+++ gcc/gcc/testsuite/gfortran.dg/coarray_28.f90	2012-09-11 07:51:24.000000000 +0200
@@ -0,0 +1,10 @@ 
+! { dg-do compile }
+! { dg-options "-fcoarray=single" }
+!
+! PR fortran/54225
+!
+
+integer, allocatable :: a[:,:]
+
+allocate (a[*,4]) ! { dg-error "Unexpected '.' for codimension 1 of 2" }
+end