diff mbox

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

Message ID 504ED20F.30209@net-b.de
State New
Headers show

Commit Message

Tobias Burnus Sept. 11, 2012, 5:54 a.m. UTC
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

Comments

Mikael Morin Sept. 12, 2012, 9:46 a.m. UTC | #1
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
diff mbox

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