Committed as r276253. -- steve
On Tue, Sep 24, 2019 at 03:07:31PM -0700, Steve Kargl wrote: > 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 -- Steve 20170425 https://www.youtube.com/watch?v=VWUpyCsUKR4 20161221 https://www.youtube.com/watch?v=IbCHE-hONow