The attached patch has been tested on x86_64-*-freebsd. OK to commit?
2019-09-24 Steven G. Kargl <[email protected]>
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 <[email protected]>
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