The attached patch has been tested on x86_64-*-freebsd.  OK to commit?

2019-09-24  Steven G. Kargl  <ka...@gcc.gnu.org>

        PR fortran/91864
        * gcc/fortran/io.c (match_io_element): An inquiry parameter cannot be
        read into.
        * gcc/fortran/match.c (gfc_match_allocate): An inquiry parameter 
        can be neither an allocate-object nor stat variable.
        (gfc_match_deallocate): An inquiry parameter cannot be deallocated.

2019-09-24  Steven G. Kargl  <ka...@gcc.gnu.org>

        PR fortran/91864
        * gcc/testsuite/gfortran.dg/pr91864.f90

-- 
Steve
Index: gcc/fortran/io.c
===================================================================
--- gcc/fortran/io.c	(revision 276104)
+++ gcc/fortran/io.c	(working copy)
@@ -3657,8 +3657,18 @@ match_io_element (io_kind k, gfc_code **cpp)
     {
       m = gfc_match_variable (&expr, 0);
       if (m == MATCH_NO)
-	gfc_error ("Expected variable in READ statement at %C");
+	{
+	  gfc_error ("Expecting variable in READ statement at %C");
+	  m = MATCH_ERROR;
+	}
 
+      if (m == MATCH_YES && expr->expr_type == EXPR_CONSTANT)
+	{
+	  gfc_error ("Expecting variable or io-implied-do in READ statement "
+		   "at %L", &expr->where);
+	  m = MATCH_ERROR;
+	}
+
       if (m == MATCH_YES
 	  && expr->expr_type == EXPR_VARIABLE
 	  && expr->symtree->n.sym->attr.external)
@@ -3667,7 +3677,6 @@ match_io_element (io_kind k, gfc_code **cpp)
 		     &expr->where);
 	  m = MATCH_ERROR;
 	}
-
     }
   else
     {
Index: gcc/fortran/match.c
===================================================================
--- gcc/fortran/match.c	(revision 276104)
+++ gcc/fortran/match.c	(working copy)
@@ -4242,6 +4242,12 @@ gfc_match_allocate (void)
       if (m == MATCH_ERROR)
 	goto cleanup;
 
+      if (tail->expr->expr_type == EXPR_CONSTANT)
+	{
+	  gfc_error ("Unexpected constant at %C");
+	  goto cleanup;
+	}
+
       if (gfc_check_do_variable (tail->expr->symtree))
 	goto cleanup;
 
@@ -4374,6 +4380,12 @@ alloc_opt_list:
 	  tmp = NULL;
 	  saw_stat = true;
 
+	  if (stat->expr_type == EXPR_CONSTANT)
+	    {
+	      gfc_error ("STAT tag at %L cannot be a constant", &stat->where);
+	      goto cleanup;
+	    }
+
 	  if (gfc_check_do_variable (stat->symtree))
 	    goto cleanup;
 
@@ -4649,6 +4661,12 @@ gfc_match_deallocate (void)
 	goto cleanup;
       if (m == MATCH_NO)
 	goto syntax;
+
+      if (tail->expr->expr_type == EXPR_CONSTANT)
+	{
+	  gfc_error ("Unexpected constant at %C");
+	  goto cleanup;
+	}
 
       if (gfc_check_do_variable (tail->expr->symtree))
 	goto cleanup;
Index: gcc/testsuite/gfortran.dg/pr91864.f90
===================================================================
--- gcc/testsuite/gfortran.dg/pr91864.f90	(nonexistent)
+++ gcc/testsuite/gfortran.dg/pr91864.f90	(working copy)
@@ -0,0 +1,22 @@
+program p
+   integer :: i
+   read (*,*) i%kind   ! { dg-error "Expecting variable or io-implied-do" }
+end
+
+subroutine t
+   integer, allocatable :: x(:)
+   integer :: stat
+   allocate (x(3), stat=stat%kind)   ! { dg-error "cannot be a constant" }
+end
+
+subroutine u
+   integer, allocatable :: x(:)
+   integer :: stat
+   allocate (x(3), stat%kind=stat)   ! { dg-error "Unexpected constant" }
+end
+
+subroutine v
+   integer, allocatable :: x(:)
+   integer :: stat
+   deallocate (x, stat%kind=stat)   ! { dg-error "Unexpected constant" }
+end

Reply via email to