re PR fortran/91864 (ICE in gfc_check_do_variable, at fortran/parse.c:4405)
authorSteven G. Kargl <kargl@gcc.gnu.org>
Sat, 28 Sep 2019 16:26:43 +0000 (16:26 +0000)
committerSteven G. Kargl <kargl@gcc.gnu.org>
Sat, 28 Sep 2019 16:26:43 +0000 (16:26 +0000)
2019-09-28  Steven G. Kargl  <kargl@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-28  Steven G. Kargl  <kargl@gcc.gnu.org>

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

From-SVN: r276253

gcc/fortran/ChangeLog
gcc/fortran/io.c
gcc/fortran/match.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/pr91864.f90 [new file with mode: 0644]

index 1c1997fb9eb19bf4a7efe0822333ec3158beecff..d5a17dadf474265f0d8008761ac1b550367ac88d 100644 (file)
@@ -1,3 +1,12 @@
+2019-09-28  Steven G. Kargl  <kargl@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-26  Alessandro Fanfarillo  <afanfa@gcc.gnu.org>
 
        * trans-array.c (structure_alloc_comps):
index bb645602a2ca1c8103de76f3558a04ae84d933d0..9ae06b1f5c424d8e0f90b3e1895175795d385f51 100644 (file)
@@ -3657,7 +3657,17 @@ 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
@@ -3667,7 +3677,6 @@ match_io_element (io_kind k, gfc_code **cpp)
                     &expr->where);
          m = MATCH_ERROR;
        }
-
     }
   else
     {
index 9b9dbf1f96f6c6afa20856fd380697bbc96b4eeb..83b1189124179aa1d96ae278f784a6dcb29c3043 100644 (file)
@@ -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;
 
@@ -4650,6 +4662,12 @@ gfc_match_deallocate (void)
       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 ecdce9b304f6a8b111c38ab5412bf468e425fd8b..8d8ba5d4d05de640251714685bb728fc1d0b6376 100644 (file)
@@ -1,3 +1,8 @@
+2019-09-28  Steven G. Kargl  <kargl@gcc.gnu.org>
+
+       PR fortran/91864
+       * gcc/testsuite/gfortran.dg/pr91864.f90
+
 2019-09-28  Marek Polacek  <polacek@redhat.com>
 
        PR c++/91889 - follow-up fix for DR 2352.
diff --git a/gcc/testsuite/gfortran.dg/pr91864.f90 b/gcc/testsuite/gfortran.dg/pr91864.f90
new file mode 100644 (file)
index 0000000..a17187d
--- /dev/null
@@ -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