https://gcc.gnu.org/bugzilla/show_bug.cgi?id=56007

--- Comment #6 from Harald Anlauf <anlauf at gmx dot de> ---
(In reply to Harald Anlauf from comment #5)
> The patch of comment #4 appears to be easily extendible to reject
> arrays as loop variables (I hope I got this right):
> 
> Index: gcc/fortran/match.c
> ===================================================================
> --- gcc/fortran/match.c (revision 232904)
> +++ gcc/fortran/match.c (working copy)
> @@ -877,6 +877,18 @@
>    if (m != MATCH_YES)
>      return MATCH_NO;
>  
> +  if (var->ts.type == BT_CHARACTER)
> +    {
> +      gfc_error ("Loop variable at %C cannot be of type CHARACTER");
> +      goto cleanup;
> +    }
> +
> +  if (var->symtree->n.sym->attr.dimension)
> +    {
> +      gfc_error ("Loop variable at %C cannot be an array");
> +      goto cleanup;
> +    }
> +
>    /* F2008, C617 & C565.  */
>    if (var->symtree->n.sym->attr.codimension)
>      {

The first part of the patch is actually not needed, thus the essential
part is:

Index: gcc/fortran/match.c
===================================================================
--- gcc/fortran/match.c (revision 232904)
+++ gcc/fortran/match.c (working copy)
@@ -877,6 +877,12 @@
   if (m != MATCH_YES)
     return MATCH_NO;

+  if (var->symtree->n.sym->attr.dimension)
+    {
+      gfc_error ("Loop variable at %C cannot be an array");
+      goto cleanup;
+    }
+
   /* F2008, C617 & C565.  */
   if (var->symtree->n.sym->attr.codimension)
     {


This removed the most confusing error messages, but leaves those
cases untouched where the parsing of the do statement should give
a syntax error.

Testsuite suggestions based on Tobias' examples:

% cat pr56007.f
! { dg-do compile }
! PR fortran/56007
! Based on testcase by Tobias Schlüter

      integer iw1(90), doiw1(90)
      do iw1(1)=1
      do iw1=1
      do iw1=1,2    ! { dg-error "cannot be an array" }
      end do        ! { dg-error "Expecting END PROGRAM statement" }
      END

% cat pr56007.f90
! { dg-do compile }
! PR fortran/56007
! Based on testcase by Tobias Schlüter

  integer iw1(90), doiw1(90)
  do iw1=1,2     ! { dg-error "cannot be an array" }
  end do         ! { dg-error "Expecting END PROGRAM statement" }
  do iw1(1)=1    ! { dg-error "Unclassifiable statement" }
  do iw1=1       ! { dg-error "cannot be an array" }
  end do         ! { dg-error "Expecting END PROGRAM statement" }
END program

Reply via email to